在scipy.sparse矩阵中找到第一个非零列 - python

我正在寻找稀疏矩阵(scipy.sparse.csc_matrix)中包含非零元素的第一列。实际上,第一列从第i个开始,包含一个非零元素。

这是某种类型的线性方程求解器的一部分。对于稠密矩阵,我具有以下内容:(相关行为pcol = ...)

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

上面应该交换列1和2。如果我们改为设置i = 0,则D不变,因为列0已经包含非零条目。

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

python大神给出的解决方案

使用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矩阵上执行相同操作,以查找第一个非零行。

如果您愿意,我可以详细说明。