在稀疏的 lil_matrix 中查找最大值及其索引 (Scipy/Python)

4 投票
1 回答
3003 浏览
提问于 2025-04-18 13:57

在一个Scipy的稀疏矩阵(lil_matrix对象)中,找到最大值以及它对应的行和列索引的最佳方法是什么?我可以使用itertools.izip来遍历那些不为零的元素,但有没有更好的方法呢?我觉得我可能漏掉了一些显而易见的东西……

1 个回答

7

你可以把数据转换成COO格式,然后使用datarowcol这几个属性。

比如说,假设有一个LIL格式的矩阵叫x。下面是一种获取最大值以及它所在行和列的方法:

In [41]: x
Out[41]: 
<1000x1000 sparse matrix of type '<type 'numpy.float64'>'
    with 1999 stored elements in LInked List format>

In [42]: y = x.tocoo()

In [43]: k = y.data.argmax()

In [44]: maxval = y.data[k]

In [45]: maxrow = y.row[k]

In [46]: maxcol = y.col[k]

注意:上面的代码有两个问题:

  • 如果所有的非零值都是负数,它会找到最大的负数。但在这种情况下,正确的答案应该是0。
  • 如果没有非零值,那么这一行k = y.data.argmax()会出错,因为y.data是一个空数组。

如果你的应用中不会出现这些情况,那就可以忽略这些问题。

撰写回答