在稀疏的 lil_matrix 中查找最大值及其索引 (Scipy/Python)
在一个Scipy的稀疏矩阵(lil_matrix对象)中,找到最大值以及它对应的行和列索引的最佳方法是什么?我可以使用itertools.izip来遍历那些不为零的元素,但有没有更好的方法呢?我觉得我可能漏掉了一些显而易见的东西……
1 个回答
7
你可以把数据转换成COO格式,然后使用data
、row
和col
这几个属性。
比如说,假设有一个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
是一个空数组。
如果你的应用中不会出现这些情况,那就可以忽略这些问题。