如何使用掩码来限制两个numpy数组之间的广播操作?

问题描述 投票:0回答:1

我有一个像这样的数组:

data = np.array([
    [[10, 10, 10],
     [10, 10, 10],
     [10, 10, 10]],

    [[20, 20, 20],
     [20, 20, 20],
     [20, 20, 20]],

    [[30, 30, 30],
     [30, 30, 30],
     [30, 30, 30]],
], dtype=np.float64)

和一个用于除以值的值,如下所示:

divide_by = np.array([
    [[10, 10, 1]],
    [[1, 10, 10]],
    [[1, 1, 1]],
], dtype=np.float64)

我想将

data
数组的每一行(轴 0)除以
divide_by
数组中的值(有点像邮票),但仅限于给定掩码(其形状为
data)的位置
)已设置为
True

所以我可以通过以下方式实现第一部分:

divide_by = divide_by.reshape(divide_by.shape[0], divide_by.shape[2])

data /= divide_by

print(data)

其产量:

[[[ 1.  1. 10.]
  [10.  1.  1.]
  [10. 10. 10.]]

 [[ 2.  2. 20.]
  [20.  2.  2.]
  [20. 20. 20.]]

 [[ 3.  3. 30.]
  [30.  3.  3.]
  [30. 30. 30.]]]

请注意,

data
数组的每一行都已除以
divide_by
中的内容,就好像它已像邮票一样应用在其顶部。太棒了。

我现在想做同样的事情,但只在该掩码设置为 true 的地方应用除法:

mask = np.array([
    [[False, True, False],
     [False, False, False],
     [True, False, False]],

    [[True, True, True],
     [False, False, True],
     [False, False, False]],

    [[True, False, False],
     [False, False, False],
     [False, False, False]],
])

因此预期输出为:

[[[10.  1. 10.]
  [10. 10.  1.]
  [10. 10. 10.]]

 [[ 2.  2. 20.]
  [20. 20.  2.]
  [20. 20. 20.]]

 [[ 3. 30. 30.]
  [30. 30. 30.]
  [30. 30. 30.]]]

掩码定义了要划分的位置的子集,

但是如果我这样做:

data[mask] /= divide_by

而不是

data /= divide_by

我得到:

ValueError: operands could not be broadcast together with shapes (7,) (3,3) (7,) 

在这种特殊情况下我该如何使用这个面膜?

python arrays numpy numpy-ndarray array-broadcasting
1个回答
0
投票

您可以使用

np.where(mask, data / divide_by[None, :, 0], data)

© www.soinside.com 2019 - 2024. All rights reserved.