我有一个numpy数组列表。每个数组保存我需要的列的值,在稀疏二进制矩阵中为1。 numpy数组在列表中出现的顺序是该numpy数组中所有值的行的值。我正在尝试使用scipy.sparse.csr_matrix来执行此操作。所以我需要两个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])
答案 0 :(得分:3)
column
只是d的平面向量,所以请尝试:
column = np.hstack(d)
对于row
,这应该有效:
row = np.hstack([np.ones(len(arr))*i for i, arr in enumerate(d)])
基本上:逐步执行d,在d中创建每个项目长度的数组,乘以d中的索引,然后将所有这些变为矢量。
答案 1 :(得分: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))
coo
,csr
和csc
都接受这种输入方式。 coo
的不同之处在于它完全按照给定的方式分配属性(因此速度很快)。其他人做了一些排序和求和(允许重复行,列对)和清理。