2015-02-05 194 views
0

我有一个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]) 

回答

3

column为d的只是一个扁平矢量,所以尝试:

column = np.hstack(d)

对于row,这应该工作:

row = np.hstack([np.ones(len(arr))*i for i, arr in enumerate(d)])

基本上:通过d,在d中每个项目的长度做一个数列,乘以它s指数,然后将所有这些变成一个向量。

+0

'np.concatenate'对这些1d阵列也是一样的。 – hpaulj 2015-02-05 20:45:08

0

两三产生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)) 

coocsrcsc所有接受输入的这种风格。 coo不同之处在于它完全按照给定的属性来分配属性(所以速度很快)。其他人做一些排序和总结(允许重复行,col对)和清洁。