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]]
我有两个代表光栅图像的 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]]