首页 > 解决方案 > 使用掩码在向量化方程 numpy 之间进行选择

问题描述

我有一个掩码操作问题。我在具有边界条件的网格(矩阵)上使用有限差分法。要计算边界条件,我使用能量平衡。所以我有 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'

我希望你能解决我的问题并能提供帮助。谢谢

标签: pythonnumpyvectorizationmask

解决方案


你想要的是:

Eq = np.diag([Eq0, Eq1, Eq2, Eq3, Eq4])

然后你的最后一行将是

M[1:Nx,1:Ny] = (mask[None, None, :] == BC[1:Nx, 1:Ny]).dot(Eq).sum(-1)

但是如果没有可运行的代码,就很难确定。


推荐阅读