gpt4 book ai didi

python - 稀疏矩阵加法产生 'ValueError: setting an array element with a sequence.'

转载 作者:行者123 更新时间:2023-12-01 04:36:20 24 4
gpt4 key购买 nike

有问题的行是:

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

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

最佳答案

问题在于

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

关于python - 稀疏矩阵加法产生 'ValueError: setting an array element with a sequence.',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31621839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com