添加ndarray和稀疏矩阵在python中转换为密集时出现广播错误

时间:2012-03-27 08:15:03

标签: python numpy scipy

我正在从scipy稀疏矩阵转换为密集矩阵,并使用+ =运算符将其添加到ndarray,我收到广播错误。 ndarray具有形状(M,),而密集矩阵具有形状(M,1)。当我尝试将numpy.matrix转换为ndarray时,形状变为(1,M)。我也尝试在转换后使用reshape(M,)并且形状变为(M,M)。有人可以解释一下我搞砸了。

M = 100
N = 1000
K = 4
a= np.zeros((M,K))

b = sp.csr_matrix(np.ones((N,1)))
d = sp.csr_matrix(np.ones((M,N)))

c = np.ones(())
for k in range(K): 
    a[:,k] += d.dot(b).todense()

P.S:我是python和stackoverflow的新手。如果这是一个错误框架的问题,或者如果之前已经提出这个问题(我找不到),请道歉

1 个答案:

答案 0 :(得分:1)

对未来googlers的旁注,OP的代码导入了以下包:

> import numpy as np
> import scipy.sparse as sp

无论如何,让我们从我们的解释开始。


您可以使用以下方法检查矩阵大小:

> np.shape(your_matrix_here) #equals to MATLAB: > size(your_matrix_here)

当你打电话给todense()时,你得到了:

matrix([[ 1000.],  #shape: (1, 100)
        [ 1000.],
        [ 1000.],
        ...

虽然[:,1]看起来像这样:

array([ 0.,  0., ... ,  0.,  0.]) #shape: (100,)

因此,您可能希望使用transpose()转置矩阵。


但转置矩阵会返回包含矩阵的矩阵:

matrix([[ 1000.,  1000., ... , 1000.,  1000.]]) #shape: (1, 100)

由于某种原因d.dot(b).todense().transpose()[0]没有返回矩阵的第一个元素:

matrix([[ 1000.,  1000., ... , 1000.,  1000.]]) #still the same!

可以使用以下方法修复:

> np.array(d.dot(b).todense().transpose())[0]

因此返回:

array([ 1000.,  1000., ... 1000.,  1000.])

现在其中两个具有相同的形状,允许它们执行矩阵操作:

> np.shape(np.array(d.dot(b).todense().transpose())[0]) #(100,)

> np.shape(a[:,1])                                      #(100,)

总之,您想要更改此行:

a[:,k] += d.dot(b).todense()

为:

a[:,k] += np.array(d.dot(b).todense().transpose())[0]