Python 值错误:使用序列设置数组元素
输入A是一个稀疏格式的邻接矩阵。我得到上面的错误: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]!=
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