将 2D np.array 中的 int 值替换为 3 个值的列表,使其成为 3D

Replace int values in 2D np.array with list of 3 values to make it 3D

我在帮助 OP 进行一些图像处理时遇到了这个问题。不管是否有其他方法来完成整个事情,在一部分中,我有一个 2D np.array 整数填充。整数只是掩码值,每个代表一种 RGB 颜色。

我有一个字典,其中整数作为键,RGB 颜色数组作为值。这是映射,目标是用颜色替换数组中的每个整数。

从这个数组开始,其中所有 RGB 数组都已被整数替换,所以现在它是一个形状 (2,3) 的数组(最初它是形状 (2,3,3))

import numpy as np
arr = np.array([0,2,4,1,3,5]).reshape(2,3)
print(arr)

array([[0, 2, 4],
       [1, 3, 5]])

这是字典(示例中选择的数字只是随机的):

dic = {0 : [10,20,30], 1 : [12,22,32], 2 : [15,25,35], 3 : [40,50,60], 4 : [100,200,300], 5 : [250,350,450]}

用数组替换所有这些值使其成为形状为 (2,3,3) 的数组,如下所示:

array([[[ 10,  20,  30],
        [ 15,  25,  35],
        [100, 200, 300]],
        
       [[ 12,  22,  32],
        [ 40,  50,  60],
        [250, 350, 450]]])

我调查了 np.where 因为我认为它对我来说是最明显的,但我总是得到形状不正确的错误。 我不知道我到底被困在哪里,在谷歌搜索时,我遇到了 np.dstacknp.concatenate,阅读了有关使用 np.newaxis / None 更改形状的信息,但我就是没有完成.也许用 np.zeros_like 创建一个新数组并从那里开始。 在插入包含这 3 个 RGB 值的数组之前,我是否需要创建类似占位符的内容?

由于每个键都在数组中,因为它是基于数组创建的,所以我考虑循环遍历字典,检查数组中的键并将其替换为 dict.value。我至少是在正确的方向还是没有结果?

非常感谢任何帮助!!!

在这方面,我们可以通过解包创建一个字典值数组,然后根据 arr 中指定的顺序对它们进行排序。所以:

np.array([*dic.values()])[arr]

如果字典键没有排序,我们可以使用 np.argsort 创建一个基于它们排序的掩码数组。因此,在根据掩码数组对字典值数组进行排序后,我们可以再次得到结果例如:

dic = {0: [10, 20, 30], 2: [15, 25, 35], 3: [40, 50, 60], 1: [12, 22, 32], 4: [100, 200, 300], 5: [250, 350, 450]}


sort_mask = np.array([*dic.keys()]).argsort()
# [0 3 1 2 4 5]

np.array([*dic.values()])[sort_mask][arr]
# [[[ 10  20  30]
#   [ 15  25  35]
#   [100 200 300]]
# 
#  [[ 12  22  32]
#   [ 40  50  60]
#   [250 350 450]]]