从Map字典中替换2D numpy数组维度中的值

g6baxovj  于 2023-01-26  发布在  其他
关注(0)|答案(3)|浏览(126)

我需要用字典中的值来替换列表中所有列表中某个索引的值,字典中的值Map到列表的另一个索引,或者,如果每个列表(在一个更大的列表中)的第一个索引值等于字典中的一个键,那么列表中第二个索引的值就变成了字典中的值。

For ex: L = [[1,2,3],[4,5,6],[7,8,9]]
        D = {'1':50, '4':10, '7':20} ##if first index is any of these keys, then the second index becomes the value
        New List = [[1,50,3],[4,10,6],[7,20,9]]

这是因为我有一个HSV值的图像,需要根据曲线替换每个像素的饱和度值,曲线描述了每种颜色(色调)的饱和度,就像after effects中的色调与饱和度曲线。
曲线描述了每个色调值的饱和度值,我需要迭代所有像素,并根据它们的色调值,从字典中更改饱和度,希望这能解释清楚。

lp0sw83n

lp0sw83n1#

如果数字都是自然数,而且范围不是很大,那么做一个Map数组,通过索引生成结果可能是最快的:

>>> L
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> mapping = np.zeros(L[:, 0].max() + 1, int)
>>> mapping[np.fromiter(D, int)] = list(D.values())
>>> mapping
array([ 0, 50,  0,  0, 10,  0,  0, 20])
>>> L[:, 1] = mapping[L[:, 0]]
>>> L
array([[ 1, 50,  3],
       [ 4, 10,  6],
       [ 7, 20,  9]])
chy5wohz

chy5wohz2#

用途

for sub in L:
    sub[1] = D.get(str(sub[0]), 0)

如果字典没有List值,则使用默认值0。
生产

[[1, 50, 3], [4, 10, 6], [7, 20, 9]]
8fsztsew

8fsztsew3#

是的,可以按以下步骤进行:

L = np.array([[1,2,3],[6,4,5],[7,8,9], [10,11,12]])
D = {'1':50, '4':10, '7':20, '8':30, '10':45}
keys = np.array(list(D.keys()), dtype=int)
vals = np.array(list(D.values()), dtype=int)

srt = L.ravel().argsort()

ind = np.searchsorted(L.ravel(),keys, sorter=srt)

r =L.ravel()
r[srt[ind]+1]= vals
print(r.reshape(L.shape))

输出:

[[1 50  3]
 [ 6  4 10]
 [ 7 20 30]
 [10 45 12]]

相关问题