【问题标题】:Using mask to pick between vectorised equations numpy使用掩码在向量化方程 numpy 之间进行选择
【发布时间】: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


【解决方案1】:

认为你想要的是:

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)

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

【讨论】:

  • 您好,谢谢您的回复。当我查看您的示例时,我没有得到'mask [None,None,:]'部分是什么意思?
  • 当我尝试您的解决方案时,我在第一行出现错误:Eq = np.diag([Eq0, Eq1, Eq2, Eq3, Eq4]) --> ValueError: Input must be 1- or 2 天。
  • 我不会猜测您的输入形状超出了我已有的范围。尝试用可运行的代码和完整的错误跟踪编写另一个问题,这样人们就可以理解你想要什么。
  • 你说得对,代码很乱,所以我不想上传。
【解决方案2】:

我的代码现在正在运行。我没有让面具工作。 @Daniel F. 的答案可能有效,但我没能成功。

我最终将numpy.where() 用于我的矢量化方程:

M[1:Nx,1:Ny] = np.where(BC[1:Nx,1:Ny]==0,1,0)*Eq0 \
 + np.where(BC[1:Nx,1:Ny]==1,1,0)*Eq1 \
 + np.where(BC[1:Nx,1:Ny]==2,1,0)*Eq2 \
 + np.where(BC[1:Nx,1:Ny]==3,1,0)*Eq3 \

继续研究不同的方程...

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2014-06-28
    • 2017-08-25
    • 2016-12-29
    • 2011-03-26
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多