Python 如何从一个巨大的(scipy.sparse)矩阵计算对角度矩阵?
给定一个100万维的二次矩阵,我想计算对角度矩阵 对角度矩阵定义为对角矩阵,每行的非零值计数作为入口 矩阵,我们称之为Python 如何从一个巨大的(scipy.sparse)矩阵计算对角度矩阵?,python,numpy,scipy,sparse-matrix,Python,Numpy,Scipy,Sparse Matrix,给定一个100万维的二次矩阵,我想计算对角度矩阵 对角度矩阵定义为对角矩阵,每行的非零值计数作为入口 矩阵,我们称之为A的格式是scipy.sparse.csr\u矩阵 如果我的机器有足够的动力,我就这么做 diagonal_degrees = [] for row in A: diagonal_degrees.append(numpy.sum(row!=0)) 我甚至试过,但结果是 ValueError: array is too big. 所以我尝试利用scipy的稀疏结构。我这
A
的格式是scipy.sparse.csr\u矩阵
如果我的机器有足够的动力,我就这么做
diagonal_degrees = []
for row in A:
diagonal_degrees.append(numpy.sum(row!=0))
我甚至试过,但结果是
ValueError: array is too big.
所以我尝试利用scipy的稀疏结构。我这样想:
diagonal_degrees = []
CSC_format = A.tocsc() # A is in scipys CSR format.
for i in range(CSC_format.shape[0]):
row = CSC_format.getrow(i)
diagonal_degrees.append(numpy.sum(row!=0))
我有两个问题:
SparseEfficiencyWarning: changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
当从CSR更改为CSC时?如果您只需要计算非零元素,那么有一种方法可能很有用 确切代码为(在和的帮助下): 尽管对于大型阵列(
dim~100万
),如所述,np.zeros((dim**2,)
给出了例外情况:ValueError:超出了允许的最大尺寸
。另一种解决方法是使用稀疏矩阵:
diag_mat = sparse.coo_matrix((dim, dim))
diag_mat.setdiag(diag_deg)
在
csr\u矩阵
中设置一个项目时,会出现错误。“改变稀疏结构”与不同稀疏矩阵格式之间的转换无关。当你添加一个“密集”项时。如果你只需要计算非零元素,这个方法看起来很有希望。正如@avaris已经告诉你的,你可以只做diag_deg,uu=np.histogram(x.nonzero()[0],np.arange(x.shape[0]+1))
@Joe:请把这变成一个答案,这样我就可以投票并接受了。这应该是@avaris的,在我看来,正如他指出的那样,nonzero
。为了补充这个伟大的解决方案,如果想从diag_deg
生成对角矩阵,他可以写diag_mat=np.zero((x.shape[0]**2,)
然后diag_mat[np.arange(0,x.shape[0]**2,x.shape[0]+1)]=diag_deg
和最后诊断材料重塑((x.shape[0],x.shape[0]))
。很抱歉代码太少……我不想为此创建新的答案;)@matehat:感谢您完成解决方案。让dim=x.shape[0]
不幸的是np。零((dim**2,)
会导致值错误:当dim
过高时,超出了允许的最大尺寸。就我而言,dim
大约是一百万。因此,在处理高维矩阵时,应该选择另一种方法。例如:diag_mat=sparse.coo_matrix((dim,dim))
然后diag_mat.setdiag(diag_deg)
@Avaris:也许你想将这两个注释合并到你的答案中。因此,对于面临类似问题的人来说,这本书变得更加完整,阅读起来也更好。@Aufwind:Will。谢谢你的通知。
diag_mat = sparse.coo_matrix((dim, dim))
diag_mat.setdiag(diag_deg)