在scipy.sparse矩阵中查找第一个非零列

时间:2015-06-15 10:09:20

标签: python numpy scipy

我正在寻找稀疏矩阵(> mymatrix = matrix(0,2,2) > mymatrix [,1] [,2] [1,] 0 0 [2,] 0 0 heatmap.2(mymatrix, col=bluered, Rowv = FALSE, trace="none", Colv = FALSE, main="Legend positioning") )中包含非零元素的第一列。实际上,第一列以scipy.sparse.csc_matrix开头,第一列包含非零元素。

这是某种线性方程求解器的一部分。对于密集矩阵,我有以下内容:(相关行为i

pcol = ...

上面应该交换第1列和第2列。如果我们设置import numpy D = numpy.matrix([[1,0,0],[2,0,0],[3,0,1]]) i = 1 pcol = i + numpy.argmax(numpy.any(D[:,i:], axis=0)) if pcol != i: # Pivot columns i, pcol D[:,[i,pcol]] = D[:,[pcol,i]] print(D) # Result should be numpy.matrix([[1,0,0],[2,0,0],[3,1,0]]) i = 0不变,因为第0列已经包含非零条目。

为scipy.sparse矩阵执行此操作的有效方法是什么?是否有Dnumpy.any()函数的类似物?

1 个答案:

答案 0 :(得分:5)

使用csc矩阵,很容易找到非零列。

In [302]: arr=sparse.csc_matrix([[0,0,1,2],[0,0,0,2]])

In [303]: arr.A
Out[303]: 
array([[0, 0, 1, 2],
       [0, 0, 0, 2]])

In [304]: arr.indptr
Out[304]: array([0, 0, 0, 1, 3])

In [305]: np.diff(arr.indptr)
Out[305]: array([0, 0, 1, 2])

最后一行显示每列中有多少非零术语。

np.nonzero(np.diff(arr.indptr))[0][0]将是该差异中第一个非零值的索引。

csr矩阵上执行相同操作以查找第1个非零行。

如果你愿意,我可以详细说明indptr