Numpy:为稀疏矩阵创建索引
问题描述:
我有一个numpy数组列表。每个数组都拥有我需要的列的值,在稀疏二进制矩阵中有1。 numpy数组出现在列表中的顺序是该numpy数组中所有值的行的值。我正在尝试使用scipy.sparse.csr_matrix来做到这一点。所以我需要两个numpy数组,一个用于列索引,另一个用于行索引。这里是什么,我需要一个例子:Numpy:为稀疏矩阵创建索引
a = np.array([1, 2, 3, 4, 5, 6])
b = np.array([10, 11, 12])
c = np.array([60, 100])
d = [a, b, c]
column = np.array([1, 2, 3, 4, 5, 6, 10, 11, 12, 60, 100])
row = np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2])
答
column
为d的只是一个扁平矢量,所以尝试:
column = np.hstack(d)
对于row
,这应该工作:
row = np.hstack([np.ones(len(arr))*i for i, arr in enumerate(d)])
基本上:通过d,在d中每个项目的长度做一个数列,乘以它s指数,然后将所有这些变成一个向量。
答
两三产生row
阵列的其它方法:
row = np.concatenate([np.ones_like(x)*i for i,x in enumerate(d)])
row = np.concatenate([[i]*len(x) for i,x in enumerate(d)])
该小例子后者,用列表复制,是一个相当快一点。但是对于大型数组,时间可能会以另一种方式进行。
对于像这样的1d阵列,hstack
与默认的concatenate
相同。
col = np.concatenate(d)
全sparse
呼叫随后(形状(N,M)
)
sparse.csr_matrix((np.ones_like(col),(row, col)),shape=(N,M))
coo
,csr
和csc
所有接受输入的这种风格。 coo
不同之处在于它完全按照给定的属性来分配属性(所以速度很快)。其他人做一些排序和总结(允许重复行,col对)和清洁。
'np.concatenate'对这些1d阵列也是一样的。 – hpaulj 2015-02-05 20:45:08