【问题标题】:Retain numpy mask when inserting arrays插入数组时保留numpy掩码
【发布时间】:2016-03-28 16:37:25
【问题描述】:

我正在尝试使用 numpy 掩码数组从光栅图像中过滤“无数据”。我正在执行的数组计算减去相邻像素的值(请参阅Applying functions to multidimensional numpy arrays without loops),但我不需要忽略任何数据值。以数组为例:

array = np.array([[78, 72, 69, 71, 58, 49],
                 [74, 67, 56, 49, 46, 50],
                 [69, 53, 44, 37, -9999, -9999],
                 [64, 58, 55, 22, 33, 24],
                 [68, 61, 47, 21, 16, 19],
                 [74, 53, 34, 12, 11, 12]])

假设 -9999 是一个无数据值。所以我将数组屏蔽如下:

array = np.ma.masked_where(array == -9999, array, False)

这会产生预期的结果。然后我需要计算每个元素与其周围 8 个邻居的差异。因此,对于“右下”邻居,这将是(此处忽略边缘像素):

result = array[1: 5, 1: 5] - array[2: 6, 2: 6]

这也产生了我想要的结果:

[[23, 19, --, --],
 [-2, 22, 4, --],
 [11, 34, 6, 14],
 [27, 35, 10, 4]]

但是,当我将结果数组作为空数组的维度插入时,掩码从 -9999 丢失,更糟糕的是,“继承”掩码的元素 ([1, 3] & [1, 4 ]) 插入其原始值。

gradient = np.empty((8, 4, 4), dtype = np.int)
gradient[0] = result

我可以再次屏蔽 -9999 值,但由于我将在梯度数组的轴 0 上应用 argmax 函数,因此保留原始值会导致问题。我正在寻找一种方法来插入上面显示的结果数组,或者寻找一种替代方法来屏蔽与空值匹配的相邻元素和/或替换结果中的值。

【问题讨论】:

  • 掩码数组有一个数据数组和一个掩码数组。 gradient 没有被屏蔽,所以只获取数据部分。掩码很脆弱,只能通过掩码感知操作来维护。
  • 解释是有道理的。我会因为我在这里的工作而避免它。

标签: python arrays numpy multidimensional-array mask


【解决方案1】:

您应该使用 nan(nan = 不是数字)值而不是 -9999:

array[array == -9999] = np.nan

然后进行计算。从这个值派生的每个值也应该是 nan。

【讨论】:

  • 所以我应该将所有数组的dtype设置为np.float?这很好,因为我的输入数组通常是浮点数。使用 np.nan,如果我尝试梯度 [0].argmin(axis=0),结果是 [1 0 0 0],我认为这意味着正在考虑 nan。这是正确的,有没有办法将 nan 从此类计算中排除?
  • 这个问题是用 nanargmin 做的:stackoverflow.com/questions/2821072/… 所以你使用 nan 而不是掩码的解决方案对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多