从映射字典中替换2D numpy数组的一个维度中的值



我需要将列表内所有列表中某个索引的值替换为字典中的值,该值映射为该列表的不同索引。或者,如果每个列表(在一个更大的列表中)的第一个索引值等于字典中的一个键,那么该列表中第二个索引处的值将更改为字典中的值。

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中的hue vs saturation曲线。

所以一条曲线描述了每个色相值的饱和度值,我需要迭代所有像素,并根据它们的色相值,从字典中改变饱和度,希望这解释得很好。

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

>>> 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]])

使用

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

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

生产

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

可以这样做:

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]]

最新更新