【发布时间】:2016-08-29 00:41:34
【问题描述】:
为了操作 Scipy 矩阵,通常使用内置方法。但有时您需要读取矩阵数据以将其分配给非稀疏数据类型。为了演示,我创建了一个随机 LIL 稀疏矩阵,并使用不同的方法将其转换为 Numpy 数组(纯 python 数据类型会更有意义!)。
from __future__ import print_function
from scipy.sparse import rand, csr_matrix, lil_matrix
import numpy as np
dim = 1000
lil = rand(dim, dim, density=0.01, format='lil', dtype=np.float32, random_state=0)
print('number of nonzero elements:', lil.nnz)
arr = np.zeros(shape=(dim,dim), dtype=float)
非零元素的数量:10000
通过索引读取
%%timeit -n3
for i in xrange(dim):
for j in xrange(dim):
arr[i,j] = lil[i,j]
3 次循环,最好的 3 次:每个循环 6.42 秒
使用nonzero() 方法
%%timeit -n3
nnz = lil.nonzero() # indices of nonzero values
for i, j in zip(nnz[0], nnz[1]):
arr[i,j] = lil[i,j]
3 个循环,3 个循环中的最佳值:每个循环 75.8 毫秒
使用内置方法直接转换为数组
这个不是读取矩阵数据的通用解决方案,所以不算解决方案。
%timeit -n3 arr = lil.toarray()
3 个循环,3 个循环中的最佳值:每个循环 7.85 毫秒
使用这些方法读取 Scipy 稀疏矩阵根本没有效率。有没有更快的方法来读取这些矩阵?
【问题讨论】:
-
迭代密集数组
arr的所有值的时间是多少?这并不快。但通常索引稀疏矩阵比索引密集数组慢。如果您真的需要速度,请直接使用矩阵的数据属性 - 以牺牲一般性为代价。 -
56.4 毫秒。几个月前我实际上了解了原始数据,并使用了@github.com/aahoo/dbscan/blob/master/dbscan.py 代码。我只是想让其他人也知道这件事。顺便说一句,感谢您的出色回答。虽然关于 SO 有类似的问题,但没有一个有一个通用的标题和有组织的答案。这就是为什么我当时找不到他们,我不得不努力学习。