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

时间:2016-07-11 14:55:21

标签: 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.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

每列的最大值为:

print A.max(axis=0)
(0, 0)  0.0575683686558
(0, 2)  0.0320187296788

我想获得与列值对应的索引。 我知道

A.getcol(i).tolist()
将返回每个列的列表,允许我使用argmax()函数,但这种方式非常慢。我想知道有下降的方法吗?

2 个答案:

答案 0 :(得分:1)

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

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方法:< / p>

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

答案 1 :(得分:1)

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

    每个矩阵列中的
  • 最大值

    max_values = A.max(axis=0)

  • 每个矩阵列中的
  • max arg

    max_args = A.argmax(axis=0)

计算每个矩阵行中的最大值和arg max(使用 axis = 1 )或计算所有矩阵的最大值和arg max(使用 axis = None < / em>的)。