【问题标题】:Sparse Matrix Addition yields 'ValueError: setting an array element with a sequence.'稀疏矩阵加法产生“ValueError:使用序列设置数组元素。”
【发布时间】:2015-10-15 19:03:07
【问题描述】:

有问题的行是:

# 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 本身并不是很熟悉,所以也许我间接导致了这个错误。

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

【问题讨论】:

  • dmatpeq 上向我们提供更多信息。我可以使用N,Np,Ne=9,3,4np.ones((Np,Np)) 代替dot 表达式来运行您的代码。

标签: python arrays numpy matrix scipy


【解决方案1】:

问题是

(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 的合理值。你真的应该给我们小样本。它使测试想法变得更加容易。

【讨论】:

  • 太棒了,谢谢。至于 ,我不得不四处寻找 N、Np、Ns、dmat、peq 的合理值。你真的应该给我们小样本。它使测试想法变得更加容易。我会在以后的帖子中记住它!
猜你喜欢
  • 2013-11-27
  • 2012-06-20
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
相关资源
最近更新 更多