我有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].
我的问题是:为什么这两个命令不相同,或者第一个命令做什么?
答案 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]]