我在帮助解决OP做一些图像处理的问题时遇到了这个问题。不管是否有其他方法来完成整个过程,在一部分中,我有一个充满整数的2D np.array
。整数只是掩码值,每个代表一个RGB颜色。
我有一个字典,整数作为键和RGB颜色数组作为值。这是映射,目标是用颜色替换数组中的每个int。
从这个数组开始所有的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]]]