替换2D np中的int值.数组与列表的3个值,使其3D



我在帮助解决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]]]

最新更新