Python 值错误:使用序列设置数组元素

Python 值错误:使用序列设置数组元素,python,python-2.7,scipy,sparse-matrix,Python,Python 2.7,Scipy,Sparse Matrix,输入A是一个稀疏格式的邻接矩阵。我得到上面的错误: def get_column_normalized_matrix(A): d=sp.csr_matrix.get_shape(A)[0] Q=mat.zeros((d,d)) V=mat.zeros((1,d)) sp.csr_matrix.sum(A,axis=0,dtype='int',out=V) for i in range(0,d): if V[0,i]!=

输入A是一个稀疏格式的邻接矩阵。我得到上面的错误:

def get_column_normalized_matrix(A):
    d=sp.csr_matrix.get_shape(A)[0]           
    Q=mat.zeros((d,d))
    V=mat.zeros((1,d))
    sp.csr_matrix.sum(A,axis=0,dtype='int',out=V)
    for i in range(0,d):
        if V[0,i]!=0:
            Q[:,i]=sc.divide(A[:,i],V[0,i])
    return Q
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第8行,在get列中
ValueError:使用序列设置数组元素。

您遇到的问题是,您正试图将稀疏矩阵指定给密集矩阵。这不是自动完成的。不过,通过使用
.todense()
,将稀疏矩阵转换为密集矩阵,修复起来相当简单:

如果您希望输出稀疏,那么您必须确保输出矩阵
Q
从一开始就是稀疏的。这可以通过以下方式实现:

import scipy.sparse as sp
import numpy.matlib as mat
import scipy as sc

def get_column_normalized_matrix(A):
    d=sp.csr_matrix.get_shape(A)[0]
    Q=mat.zeros((d,d))
    V=mat.zeros((1,d))
    sp.csr_matrix.sum(A,axis=0,dtype='int',out=V)
    for i in range(0,d):
        if V[0,i]!=0:
            # Explicitly turn the sparse matrix into a dense one:
            Q[:,i]=sc.divide(A[:,i],V[0,i]).todense() 
    return Q

可以看出,
Q
是作为
a
的副本创建的。这使得同一元素在两个矩阵中都不为零,这确保了有效的更新,因为不会添加任何新元素。

您最好在此处粘贴堆栈跟踪,而不是使用图像。查看
sc.divide(…)
。这是怎么一回事?它是一个适合
Q[:,i]
的数组吗?如果您还使用密集数组(例如,
a.a
)演示此操作,可能会有所帮助。但我也希望Q是稀疏矩阵。那么,我是否应该在下一步中再次将Q转换为稀疏格式?对于大型矩阵,这不是非常低效和缓慢吗?您将
Q
定义为密集。尝试将稀疏行放入其中,即使有效,也不会使其稀疏。但我必须将Q初始化为零矩阵。因为它没有稀疏表示法,所以我必须将其初始化为密集矩阵。@debmalyasarkar我添加了一个解决方案,使
Q
成为稀疏矩阵。希望这就是你所希望的。哦,是的。这就是我所希望的。非常感谢!
import scipy.sparse as sp
import numpy.matlib as mat
import scipy as sc

def get_column_normalized_matrix(A):
    d=sp.csr_matrix.get_shape(A)[0]
    Q=mat.zeros((d,d))
    V=mat.zeros((1,d))
    sp.csr_matrix.sum(A,axis=0,dtype='int',out=V)
    for i in range(0,d):
        if V[0,i]!=0:
            # Explicitly turn the sparse matrix into a dense one:
            Q[:,i]=sc.divide(A[:,i],V[0,i]).todense() 
    return Q
def get_column_normalized_matrix(A):
    d=sp.csr_matrix.get_shape(A)[0]
    Q=sp.csr_matrix(A) # Create sparse output matrix
    V=mat.zeros((1,d))
    sp.csr_matrix.sum(A,axis=0,dtype='int',out=V)
    for i in range(0,d):
        if V[0,i]!=0:
            # Update sparse matrix
            Q[:,i]=sc.divide(A[:,i],V[0,i]) 
    return Q