【发布时间】:2021-02-09 13:51:40
【问题描述】:
我的掩码操作有问题。我在具有边界条件的网格(矩阵)上使用有限差分法。要计算边界条件,我使用能量平衡。 所以我有 5 个矢量化方程 (Eq0 - Eq4),BC 声明要用于索引的方程。要选择 Eq,我使用掩码:
mask = [0,1,2,3,4]
I = np.identity(5)
e0, e1, e2, e3, e4 = I[:,0], I[:,1], I[:,2], I[:,3], I[:,4]
BC 是我的案例矩阵,用于该索引的方程式。喜欢:
BC =
[[0. 0. 0. ... 0. 0. 0.]
[0. 0. 1. ... 2. 2. 0.]
[0. 0. 4. ... 4. 0. 0.]
...
[0. 0. 4. ... 4. 0. 0.]
[0. 0. 3. ... 3. 3. 0.]
[0. 0. 0. ... 0. 0. 0.]]
for n in range(1,Nt):
Mn = np.copy(M)
M[1:Nx,1:Ny] = (mask==BC[1:Nx,1:Ny]).dot(e0) * Eq0 + (mask==BC[1:Nx,1:Ny]).dot(e1) * Eq1 + (mask==BC[1:Nx,1:Ny]).dot(e2) * Eq2 + (mask==BC[1:Nx,1:Ny]).dot(e3) * Eq3 + (mask==BC[1:Nx,1:Ny]).dot(e4) * Eq4
我尝试了不同的方法来掩盖方程式,但总是出错。
np.dot(mask==BC[1:Nx,1:Ny],e0) --> ValueError: operands could not be broadcast together with shapes (18,) (51,51)
(1*(mask==BC[1:Nx,1:Ny])).dot(e0) --> AttributeError: 'int' object has no attribute 'dot'
AttributeError: 'bool' object has no attribute 'dot'
我希望你能解决我的问题并提供帮助。 谢谢你
【问题讨论】:
-
嗨,我从掩码版本更改为使用 numpy.where()。 (mask==BC[1:Nx,1:Ny]).dot(e0) --> np.where(BC[1:Nx,1:Ny]==0,1,0),现在我不明白一个错误。但是计算是错误的,但我认为这是我的方程的问题。
-
我发现您的整体问题很难理解,但也许这会有所帮助? numpy.org/doc/stable/reference/generated/numpy.select.html - 类似于 np.where() 但同时适用于多个条件。
-
您好,谢谢。当您查看 BC 矩阵时,您可以看到每个节点都有一个数字。我对方程式进行了矢量化,每个数字都有相应的方程式。就像当 BC[1:Nx,1:Ny] = 4 时,用公式 4 计算,另一个变为 0。
标签: python numpy vectorization mask