Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在已沿稀疏矩阵的轴计算argmax后,沿该轴取最大值_Python_Scipy_Sparse Matrix - Fatal编程技术网

Python 在已沿稀疏矩阵的轴计算argmax后,沿该轴取最大值

Python 在已沿稀疏矩阵的轴计算argmax后,沿该轴取最大值,python,scipy,sparse-matrix,Python,Scipy,Sparse Matrix,我想沿着scipy.sparse矩阵的轴取argmax和maxX >>> type(X) scipy.sparse.csr.csr_matrix >>> idx = X.argmax(axis=0) >>> maxes = X.max(axis=0) 我不想计算两次最大值,但我不能把X当作np.ndarray来使用。如何将argmax中的索引应用到X?我成功地实现了您想要的结果,即调整您链接的方法: from scipy.sparse

我想沿着scipy.sparse矩阵的轴取argmax和max
X

>>> type(X)
scipy.sparse.csr.csr_matrix

>>> idx = X.argmax(axis=0)

>>> maxes = X.max(axis=0)

我不想计算两次最大值,但我不能把
X
当作np.ndarray来使用。如何将argmax中的索引应用到
X

我成功地实现了您想要的结果,即调整您链接的方法:

from scipy.sparse import csr_matrix

a = [[4, 0, 0], [0, 3, 0], [0, 0, 1]]
a = csr_matrix(a)
idx = a.argmax(axis=0)
m = a.shape[1]
a[idx,np.arange(m)[None,:]].toarray()
产出:

array([[4, 3, 1]], dtype=int32)

您的
idx
位于不同的轴上。无论如何,这实际上要慢一点。稀疏矩阵索引的速度不如密集矩阵索引的速度。@hpaulj现在它正在提取所需轴上的最大值。我没有用一个非常大的矩阵来测试这个解决方案,看看你提到的速度差异是否显著。现在我在想,如果转换为
np.array
,然后执行
argmax
max
会更快。@H.Tacon问题是密集版本太大,无法放入内存,这就是使用sparse的最初动机。我可以想象复制sparse
argmax
的底层代码以返回索引和值。但除此之外,我怀疑这种双重评估将是最快的,你不能简单地将密集的数组直觉转换为稀疏的。@hpaulj听上去很蹩脚,我希望我有稀疏的矩阵直觉。。。我想知道我钻研源代码所花的时间是否会少于我将节省的时间。Csr
argmax
使用
indptr
在矩阵的行上迭代,然后在该行上找到最大值。这在概念上很简单,除了行可能都是0,或者0本身是最小值或最大值。使用
lil
格式时,可能更容易可视化矩阵的行。