from scipy.sparse import coo_matrix
import numpy as np
row = np.array([0, 3, 1, 0])
col = np.array([0, 2, 3, 2])
data = np.array([-3, 4, 11, -7])
A= coo_matrix((data, (row, col)), shape=(4, 4))
print A.toarray()
nrRows=A.shape[0]
maxrowind=[]
for i in range(nrRows):
r = A.getrow(i)# r is 1xA.shape[1] matrix
maxrowind.append( r.indices[r.data.argmax()] if r.nnz else 0)
print maxrowind
5 回答
从scipy版本0.19开始,
csr_matrix
和csc_matrix
都支持argmax()
和argmin()
方法 .我建议研究代码
其中
moo
是coo_matrix
.根据轴的不同,它更喜欢使用csc而不是csr . 我猜测应该可以在计算中包含
argmax
.这个建议可能行不通 . 关键是
mat._minor_reduce
方法,它做了一些改进:也就是将
ufunc
应用于矩阵data
数组的块,使用indptr
来定义块 .np.sum
,np.maxiumum
是ufunc
这里有效 . 我不知道等效的argmax
ufunc .一般情况下,如果你想通过'row'为csr矩阵(或csc的col)做事,你要么必须遍历相对昂贵的行,要么使用
ufunc.reduceat
在flatmat.data
vector上做同样的事情 .group argmax/argmin over partitioning indices in numpy尝试执行
argmax.reduceat
. 那里的解决方案可能适用于稀疏矩阵 .如果
A
是您的scipy.sparse.coo_matrix
,那么您将获得最大值的行和列,如下所示:要获得每行的最大值索引,请参阅下面的编辑:
r.nnz
是显式存储值的计数(即非零值)最新版本的numpy_indexed包(免责声明:我是它的作者)可以高效优雅的方式解决这个问题:
在这里我们按col分组,所以它的argmax在列上;交换行和col将为您提供行上的argmax .
扩展来自@hpaulj和@joeln的答案并使用group argmax/argmin over partitioning indices in numpy建议的代码,此函数将计算CSR上的argmax列或CSC上的行argmax:
对于完全稀疏的任何行(CSR)或列(CSC)的argmax,它返回-1(即,在
X.eliminate_zeros()
之后完全为零) .