将 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.dstack
、np.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]]]
我在帮助 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.dstack
、np.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]]]