【问题标题】:Difference in numpy array maskingnumpy 数组掩码的区别
【发布时间】:2019-10-12 23:29:08
【问题描述】:

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

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

【问题讨论】:

  • 为什么使用np.uint8 作为掩码?那不应该是一个布尔数组吗?
  • 检查 source[mask] 给你什么
  • 公平,如果我将它转换为布尔值,它会做它应该做的。但我的问题仍然存在,我的第一个版本实际上是做什么的?
  • @Divakar 我来自这一边,了解正在发生的事情正是我遇到的问题,因此提出了这个问题。

标签: python arrays numpy 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]]

【讨论】:

  • 是的,这有帮助。我仍然需要弄清楚整数索引和广播到底在做什么,但这让我朝着正确的方向前进。
  • 非常感谢。我编辑了您的答案以获得更好的可读性,但现在对我来说很有意义。所以,我从我的原始矩阵中取线,因为我的索引空间是一个 3 元组广播到一个 3-D 矩阵发生。
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
相关资源
最近更新 更多