numpy 数组掩码的区别

Difference in numpy array masking

我有三个 numpy 数组,一个源数组,一个目标数组和一个掩码数组。我只想在掩码等于 1 的地方用源中的相同值替换目标中的值。

我天真的尝试是:

import numpy as np
destination = np.arange(9).reshape((3,3))
source = np.ones((3,3))
mask = np.zeros((3,3)).astype(np.uint8)
mask[1,1]=1

destination[mask] = source[mask]

这让我 destination 成为

[[1, 1, 1],
 [1, 1, 1],
 [6, 7, 8]]

而我希望它是

[[0, 1, 2],
 [3, 1, 5],
 [6, 7, 8]].

当我这样做时,我确实得到了正确的结果

destination[mask==1] = source[mask==1].

我的问题是:为什么这两个命令不相同,或者第一个甚至做了什么?

首先,您必须检查矩阵内部以及哪个矩阵可以满足您的需求。

mask

输出

[[0, 0, 0],
 [0, 1, 0],
 [0, 0, 0]]

但是destination[mask == 1]给你一个布尔矩阵

mask == 1 

输出

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

鉴于:

destination[mask]

输出

[[[0, 1, 2],
  [0, 1, 2],
  [0, 1, 2]]

[[0, 1, 2],
 [3, 4, 5],
 [0, 1, 2]],

[[0, 1, 2],
 [0, 1, 2],
 [0, 1, 2]]]

但是使用 destination[mask == 1] 给你一个单一的值,它是 4。source[mask == 1] 是一样的,它给你单一的值 1。

如果您使用 destination[mask==1] = source[mask==1] 而不是 destination[mask] = source[mask],您只会更改目标矩阵中的值 4。

希望我的解释清楚。

编辑:

希望我理解你的问题是正确的:

简单的整数索引结构 x[[i]] 给出了矩阵的第 i 行。

所以 destination[0,1,2] 给出:

[[0, 1, 2],
 [3, 4, 5],
 [6, 7, 8]]

对于一个可以理解的例子,输入 destination[1,2,0] 导致

[[3, 4, 5],
 [6, 7, 8],
 [0, 1, 2]]