Value Error:Setting an array element with sequence

Value Error:Setting an array element with sequence

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

输入 A 是稀疏的邻接矩阵 format.I 我得到上面的错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in get_column_normalized_matrix
ValueError: setting an array element with a sequence.

您遇到的问题是您试图将稀疏矩阵分配给密集矩阵。这不是自动完成的。但是,通过使用 .todense():

将稀疏矩阵变成密集矩阵,修复起来相当简单
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 是稀疏的。可以通过以下方式实现:

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

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