numpy阵列遮罩的差异

时间:2019-05-27 11:30:45

标签: python arrays numpy mask

我有3个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].

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

1 个答案:

答案 0 :(得分: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]]