用字典值替换大numpy张量中的条目
我有一个很大的numpy张量,还有一个很大的字典。请问,最快的方式是什么,把张量里的值(假设这些值是字典里的键)替换成字典里对应的值。
比如,我有一个包含百万个条目的张量,像这样:
np.asarray([[[1,2,3],[4,5,6],[7,8,9],[2,4,5,]],
[[2,3,4],[7,8,9],[10,11,23],[6,3,1]],
[[4,55,6],[90,8,2],[1,2,3],[0,94,1]],
[[6,7,8],[3,4,5],[6,7,8],[9,8,2]],
[[9,8,8],[4,5,6],[34,55,6],[3,52,2]]
...................................
...................................]
dictionary = {4:6,5:67,8:99,.........} #million entries in dictionary
3 个回答
0
如果你的字典(dict)里有整数作为键,你可以很简单地把它转换成一个向量 v
,其中 v[i] = dictionary[i]
。然后,你只需要用大张量来索引这个 v
。
# Assuming foo is the big tensor and d is the dictionary
# Set up v
v = np.arange(max(d.keys())+1)
for key,val in d.iteritems():
v[key] = val
# Do the replacements all at once:
replaced = v[foo]
如果你遇到 IndexError
的问题,可以试试用 v = np.arange(foo.max()+1)
来解决。
0
np.asarray([[[1,2,3],[4,5,6],[7,8,9],[2,4,5,]],
[[2,3,4],[7,8,9],[10,11,23],[6,3,1]],
[[4,55,6],[90,8,2],[1,2,3],[0,94,1]],
[[6,7,8],[3,4,5],[6,7,8],[9,8,2]],
[[9,8,8],[4,5,6],[34,55,6],[3,52,2]]
...................................
...................................]
dictionary = {4:6,5:67,8:99,.........}
#you must do something like this
for k,v in dictionary.iteritems():
dictionary[array[k]]=array[v]
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
1
不确定这是不是最快的方法,但我来给你分享一下:
In [33]: arr = np.asarray([[[1,2,3],[4,5,6],[7,8,9],[2,4,5,]],
...: [[2,3,4],[7,8,9],[10,11,23],[6,3,1]],
...: [[4,55,6],[90,8,2],[1,2,3],[0,94,1]],
...: [[6,7,8],[3,4,5],[6,7,8],[9,8,2]],
...: [[9,8,8],[4,5,6],[34,55,6],[3,52,2]]])
In [34]: dct = {int(random.random()*100): int(random.random()*100) for _ in xrange(100)}
In [35]: arr.ravel()[:] = np.fromiter((dct.get(x, x) for x in arr.ravel()), dtype=arr.dtype)
In [36]: arr
Out[36]:
array([[[18, 94, 53],
[71, 73, 6],
[35, 7, 9],
[94, 71, 73]],
[[94, 53, 71],
[35, 7, 9],
[10, 42, 15],
[ 6, 53, 18]],
[[71, 50, 6],
[90, 7, 94],
[18, 94, 53],
[ 0, 94, 18]],
[[ 6, 35, 7],
[53, 71, 73],
[ 6, 35, 7],
[ 9, 7, 94]],
[[ 9, 7, 7],
[71, 73, 6],
[99, 50, 6],
[53, 52, 94]]])