python - 插入数组时保留numpy掩码

标签 python arrays numpy multidimensional-array mask

我正在尝试使用 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 函数,因此保留原始值会导致问题。我正在寻找一种方法来插入上面显示的结果数组,或者一种屏蔽的替代方法来排除与空值匹配的邻居元素和/或替换结果中的值。

最佳答案

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

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

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

关于python - 插入数组时保留numpy掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34415419/

相关文章:

php:显示关联数组的每个元素的键和值

python - 提取值高于阈值的 numpy 数组的子数组

python - 如何将一个列表的元素放入另一个列表的中间?一款一维战舰游戏。 (Python)

python - 转让 numpy 数据的所有权

python - numpy.rint 可以返回一个 Int32 吗?

python - 了解显式添加 () 以获得评估的必要性

python - 有没有更好更易读的方法来合并 Pandas 中的列

python - Python 正则表达式中允许的最大重复次数是多少?

尽管出现 UnicodeDecodeError,Python 3 itertools.islice 仍继续

python - 以其他列组的最大值为条件计算新列