Numpy:根据两个二维阵列栅格的组合对二维阵列栅格进行分类

Numpy: classify 2D array raster based on combinations of two 2D array rasters

我有两个代表光栅图像的 2D numpy 数组,其中 classes 1, 2, 3 存在。

我需要获取这两个数组的所有可能组合(在本例中应该是 3 × 3 = 9)并创建一个新的二维数组,该数组 class 化为 1-8 基于现场存在哪种组合。

还有 np.nan 值,因为它对于栅格来说很自然(必须是 MxN 矩形),但从来没有 np.nan 和有效类别的组合。

举例说明我对小样本数组的想象:

输入数组:

a = np.array([
    [1,2,3],
    [3,1,1]
])

b = np.array([
    [1,2,1],
    [3,3,3]
])

可能的组合(假设上面的数组更大,这些组合可能都会出现):

possible_combinations = [
    (1,1), # class 1
    (2,1), # class 2
    (3,1), # class 3 
    (1,2), # class 4
    (1,3), # class 5
    (2,2), # class 6
    (2,3), # class 7
    (3,2), # class 8
    (3,3)  # class 9
]

新class化数组:

>>> array(
       [[1, 6, 3],
        [9, 5, 5]]
    )

编辑

@Andrej Kesely 的回答基本明白了。当两个 nan 值在 pair/pixel 向量中相遇时,会出现一个问题,我忘了明确提及。这是一个不受欢迎的 class(并且是一个组合,因为它自 np.nan != np.nan 以来就没有意义)。要放弃这些对,我们只需要修改解决方案的最后一步:

x = np.array(
    [[np.nan if all(np.isnan(pixel) for pixel in y) else possibl_combinations[tuple(y)] for y in x] for x in np.dstack((imgs[0], imgs[1]))]
)

现在它已经变成了一个非常糟糕的单线,但仍然有效。

您可以使用 np.dstack 来“压缩”这两个矩阵。

# to speed up, convert possible_combinations to dict:
possible_combinations = {c: i for i, c in enumerate(possible_combinations, 1)}

x = np.array(
    [[possible_combinations[tuple(y)] for y in x] for x in np.dstack((a, b))]
)
print(x)

打印:

[[1 6 3]
 [9 5 5]]