python稀疏矩阵获取最大值和索引

python稀疏矩阵获取最大值和索引,python,scipy,sparse-matrix,csr,Python,Scipy,Sparse Matrix,Csr,我有一个稀疏矩阵a(密度等于10*3),例如: print type(A) <class scipy.sparse.csr.csr_matrix> print A (0, 0) 0.0160478743808 (0, 2) 0.0317314165078 (1, 2) 0.0156596521648 (1, 0) 0.0575683686558 (2, 2) 0.0107481166871 (3, 0) 0.0150580924929 (3, 2) 0.0297743

我有一个稀疏矩阵a(密度等于10*3),例如:

print type(A)
<class scipy.sparse.csr.csr_matrix>

print A
(0, 0)  0.0160478743808
(0, 2)  0.0317314165078
(1, 2)  0.0156596521648
(1, 0)  0.0575683686558
(2, 2)  0.0107481166871
(3, 0)  0.0150580924929
(3, 2)  0.0297743235876
(4, 0)  0.0161931803955
(4, 2)  0.0320187296788
(5, 2)  0.0106034409766
(5, 0)  0.0128109177074
(6, 2)  0.0105766993238
(6, 0)  0.0127786088452
(7, 2)  0.00926522256063
(7, 0)  0.0111941023699
我想得到对应于列值的索引。
我知道,将返回允许我使用argmax()函数的每个列的列表,但这种方法非常慢。我想知道有什么下降的方法吗?

这是您在问题中建议的方法的一个细微变化:

A.getcol(i).tolist()
col_argmax = [A.getcol(i).A.argmax() for i in range(A.shape[1])]
.A
属性相当于
.toarray()

一个可能更有效的替代方案是

B = A.tocsc()
col_argmax = [B.indices[B.indptr[i] + B.data[B.indptr[i]:B.indptr[i+1]].argmax()] for i in range(len(B.indptr)-1)]

以上两种方法都可以,但我必须问:如果数组有形状(10,3),为什么要使用稀疏矩阵?(10,3)很小!只需使用一个规则、密集的numpy数组

即使将
A
保持为稀疏矩阵,计算该大小矩阵列的argmax的最有效方法可能是将其转换为密集数组并使用argmax方法:

col_argmax = A.A.argmax(axis=0)

获取每个矩阵列中的max和argmax值的更有效方法是简单地使用scipy.sparse native函数:

  • 每个矩阵列中A的最大值

    max\u值=A.max(轴=0)

  • 每个矩阵列中A的最大arg

    max\u args=A.argmax(轴=0)


计算每个矩阵行中的最大值和arg max(使用axis=1)或计算所有矩阵的最大值和arg max(使用axis=None)也是一样的。

您的矩阵是否可以放入内存中?执行
A.todense()。同时:你能转换成CSC格式吗?如果是这样,有一种方法可以相当有效地获取列的argmax。@kbrose,.todense()不可能,因为数据的大小不适合内存。你好,沃伦,非常感谢你的回答!我测试了您的解决方案,它比.toarray()或.todense()函数更快。唯一的问题是,当一个或稀疏矩阵列为空(满0)时,您的方法不起作用。在这种情况下,只需为我返回一个随机数就可以了,因此我将代码的一小部分更改为:def get_max(i):try:index=B.data[B.indptr[i]:B.indptr[i+1]].argmax(),除了:#列之和为零#,此测试文档在train doc index=-1返回索引maxval_index=[B.index[B.indptr[i]+get_max(i)]中没有出现任何单词,因为i在范围内(len(B.indptr)-1)]对于您的问题,我为什么选择稀疏矩阵,因为矩阵的实际大小是100k*300k,我想用另一个大矩阵计算A的内积。CSR.dot函数非常快。这就是我选择稀疏矩阵的原因。“…因为我的矩阵的实际大小是100k*300k…”好的,这是使用稀疏矩阵的一个很好的理由。你应该在问题中包括这些信息。
col_argmax = A.A.argmax(axis=0)