【问题标题】:Find first nonzero column in scipy.sparse matrix在 scipy.sparse 矩阵中查找第一个非零列
【发布时间】:2015-08-30 18:59:03
【问题描述】:

我正在寻找包含稀疏矩阵 (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() 函数有类似物吗?

【问题讨论】:

  • 对否决票的解释会很好......
  • 我没有对这个问题投票。但是您可以通过添加MVCE 来改进它并使其更容易回答。有关示例,请参阅 this recent questionthis older question of mine。你在第二句话中的要求也很难理解,所以也许你也可以把它说得更清楚。
  • @YXD 谢谢,我试图让它更清楚。示例代码可以复制粘贴到 python 解释器中。
  • 查看矩阵indptr属性。对于csc,它指向连续列的开始。第一个大于 0 的值将是具有非零值的第一列。

标签: python numpy scipy


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 2017-04-20
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多