Numpy:为稀疏矩阵创建索引

时间:2015-02-05 19:31:08

标签: python arrays numpy matrix

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

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))

coocsrcsc都接受这种输入方式。 coo的不同之处在于它完全按照给定的方式分配属性(因此速度很快)。其他人做了一些排序和求和(允许重复行,列对)和清理。

相关问题