用字典值替换大numpy张量中的条目

2 投票
3 回答
524 浏览
提问于 2025-04-19 11:21

我有一个很大的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]]])

撰写回答