我有一个像这样的数组:
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,)
在这种特殊情况下我该如何使用这个面膜?
您可以使用
np.where(mask, data / divide_by[None, :, 0], data)
。