稀疏矩阵加法产生' ValueError:用序列设置数组元素。'

时间:2015-07-25 01:09:44

标签: python arrays numpy matrix scipy

有问题的行是:

# Make efficient matrix that can be built
K = sparse.lil_matrix((N, N))

# Calculate K matrix (<i|pHp|j> in the LGL-nodes basis)
for i in range(Ne):
    idx_s, idx_e = i*(Np-1), i*(Np-1)+Np
    print(shape(K[idx_s:idx_e, idx_s:idx_e]))
    print(shape(dmat.T.dot(sparse.spdiags(w*peq[idx_s:idx_e], 0, Np, Np)).dot(dmat)))
    K[idx_s:idx_e, idx_s:idx_e] += dmat.T.dot(sparse.spdiags(w*peq[idx_s:idx_e], 0, Np, Np)).dot(dmat)

但是,目前,Numpy正在产生错误

(8, 8)
(8, 8)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-62-cc7cc21f07e5> in <module>()
     22 
     23 for _ in range(N):
---> 24     ll, q = getLL(Ne, Np, x_d, w_d, dmat_d, x, w, dL, peq*peq, data)
     25     peq = (peq*q)
     26 

<ipython-input-61-a52c13d48b87> in getLL(Ne, Np, x_d, w_d, dmat_d, x, w, dmat, peq, data)
     15         print(shape(K[idx_s:idx_e, idx_s:idx_e]))
     16         print(shape(dmat.T.dot(sparse.spdiags(w*peq[idx_s:idx_e], 0, Np, Np)).dot(dmat)))
---> 17         K[idx_s:idx_e, idx_s:idx_e] += dmat.T.dot(sparse.spdiags(w*peq[idx_s:idx_e], 0, Np, Np)).dot(dmat)
     18 
     19     # Re-make matrix for efficient vector products

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scipy/sparse/lil.py in __iadd__(self, other)
    157 
    158     def __iadd__(self,other):
--> 159         self[:,:] = self + other
    160         return self
    161 

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scipy/sparse/lil.py in __setitem__(self, index, x)
    307 
    308         # Make x and i into the same shape
--> 309         x = np.asarray(x, dtype=self.dtype)
    310         x, _ = np.broadcast_arrays(x, i)
    311 

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numpy/core/numeric.py in asarray(a, dtype, order)
    460 
    461     """
--> 462     return array(a, dtype, copy=False, order=order)
    463 
    464 def asanyarray(a, dtype=None, order=None):

ValueError: setting an array element with a sequence.

这有点神秘,因为似乎错误发生在Numpy库中的某个地方 - 而不是在我的代码中。但是我本身并不十分熟悉numpy,所以也许我间接导致错误。

两个切片的形状相同,因此似乎不是实际的错误。

1 个答案:

答案 0 :(得分:2)

问题在于

(dmat.T.dot(sparse.spdiags(w*peq[idx_s:idx_e], 0, Np, Np)).dot(dmat)

不是一个简单的数组。它具有正确的形状,但元素是稀疏矩阵(错误消息中的“序列”)。

将内部稀疏矩阵转换为密集阵列可以解决问题:

dmat.T.dot(sparse.spdiags(w*peq[idx_s:idx_e], 0, Np, Np).A).dot(dmat)

np.dot方法不知道稀疏矩阵,至少不在您的numpy版本(1.8?)中,因此它将其视为序列。较新版本的“稀疏”意识。

另一种解决方案是使用稀疏矩阵乘积(dot*)。

sparse.spdiags(...).dot(dmat etc)

我不得不四处寻找N,Np,Ns, dmat,peq的合理值。你真的应该给我们小样本。它使测试想法变得更加容易。