scipy.sparse.coo_matrix.max给定轴,返回每行或每列的最大值.我想知道的不是值,而是每行或每列的最大值的索引.我还没有办法以有效的方式做到这一点,所以我很乐意接受任何帮助.
我有一个 CSR 格式的 scipy 稀疏矩阵。它的尺寸为 72665x72665,因此将此矩阵转换为稠密矩阵来执行运算是不切实际的(此矩阵的稠密表示大约为 40 gig)。该矩阵是对称的,有大约 8200 万个非零项 (~1.5%)。
我想要做的是,对于每一行,我想要获得最大 N 值的索引。如果这是一个 numpy 数组,我会这样做np.argpartition:
for row in matrix:
top_n_idx = np.argpartition(row,-n)[-n:]
Run Code Online (Sandbox Code Playgroud)
对于稀疏矩阵,我可以做类似的事情吗?
在阅读了这个类似的问题后,我仍然无法完全理解如何实施我正在寻找的解决方案。我有一个稀疏矩阵,即:
import numpy as np
from scipy import sparse
arr = np.array([[0,5,3,0,2],[6,0,4,9,0],[0,0,0,6,8]])
arr_csc = sparse.csc_matrix(arr)
Run Code Online (Sandbox Code Playgroud)
我想有效地获得每行的前 n 个项目,而不将稀疏矩阵转换为密集矩阵。最终结果应如下所示(假设 n=2):
top_n_arr = np.array([[0,5,3,0,0],[6,0,0,9,0],[0,0,0,6,8]])
top_n_arr_csc = sparse.csc_matrix(top_n_arr)
Run Code Online (Sandbox Code Playgroud) 我试图找到一种有效的方法,让我通过一些常数值增加稀疏矩阵的前k值.我目前正在使用以下代码,这对于非常大的矩阵来说非常慢:
a = csr_matrix((2,2)) #just some sample data
a[1,1] = 3.
a[0,1] = 2.
y = a.tocoo()
idx = y.data.argsort()[::-1][:1] #k is 1
for i, j in izip(y.row[idx], y.col[idx]):
a[i,j] += 1
Run Code Online (Sandbox Code Playgroud)
实际上排序似乎很快,问题在于我的最后一个循环,我通过索引排序索引来增加值.希望有人知道如何加快速度.