Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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 如何从一个巨大的(scipy.sparse)矩阵计算对角度矩阵?_Python_Numpy_Scipy_Sparse Matrix - Fatal编程技术网

Python 如何从一个巨大的(scipy.sparse)矩阵计算对角度矩阵?

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的稀疏结构。我这

给定一个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的稀疏结构。我这样想:

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))
我有两个问题:

  • 有没有更有效的方法,我可能忽略了
  • CSR、CSC和COO格式之间的所有转换都是高效的线性时间操作

    为什么我会得到一份工作

    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)