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