如何使用字典翻译/替换数组元素?

Sha*_*ang 5 python arrays dictionary numpy

我有一个numpy数组,它有数百个大写字母元素,没有特别的顺序

import numpy as np
abc_array = np.array(['B', 'D', 'A', 'F', 'H', 'I', 'Z', 'J', ...])
Run Code Online (Sandbox Code Playgroud)

这里的每个元素numpy.ndarray都是numpy.string_.

我还有一个"翻译词典",其中键/值对使得大写字母对应于一个城市

transdict = {'A': 'Adelaide', 'B': 'Bombay', 'C': 'Cologne',...}
Run Code Online (Sandbox Code Playgroud)

字典中只有26对transdict,但是我必须翻译的numpy数组中有数百个字母.

最有效的方法是什么?

我考虑过使用numpy.core.defchararray.replace(a, old, new, count=None)[source]但是这会返回一个ValueError,因为numpy数组与字典键/值的大小不同.

AttributeError: 'numpy.ndarray' object has no attribute 'translate'

Pru*_*une 9

这会吗?有时,纯 Python 是处理此类事情的一种直接的好方法。下面构建了一个翻译列表(很容易转换回一个 numpy 数组)和连接的输出。

import numpy as np
abc_array = np.array(['B', 'D', 'A', 'F', 'H', 'I', 'Z', 'J'])

transdict = {'A': 'Adelaide',
             'B': 'Bombay',
             'C': 'Cologne',
             'D': 'Dresden',
             'E': 'Erlangen',
             'F': 'Formosa',
             'G': 'Gdansk',
             'H': 'Hague',
             'I': 'Inchon',
             'J': 'Jakarta',
             'Z': 'Zambia'
}

phoenetic = [transdict[letter] for letter in abc_array]
print ' '.join(phoenetic)
Run Code Online (Sandbox Code Playgroud)

输出结果是:

Bombay Dresden Adelaide Formosa Hague Inchon Zambia Jakarta
Run Code Online (Sandbox Code Playgroud)


Div*_*kar 7

随着蛮力 NumPy broadcasting -

idx = np.nonzero(transdict.keys() == abc_array[:,None])[1]
out = np.asarray(transdict.values())[idx]
Run Code Online (Sandbox Code Playgroud)

使用np.searchsorted基于搜索和索引 -

sort_idx = np.argsort(transdict.keys())
idx = np.searchsorted(transdict.keys(),abc_array,sorter = sort_idx)
out = np.asarray(transdict.values())[sort_idx][idx]
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [1]: abc_array = np.array(['B', 'D', 'A', 'B', 'D', 'A', 'C'])
   ...: transdict = {'A': 'Adelaide', 'B': 'Bombay', 'C': 'Cologne', 'D': 'Delhi'}
   ...: 

In [2]: idx = np.nonzero(transdict.keys() == abc_array[:,None])[1]
   ...: out = np.asarray(transdict.values())[idx]
   ...: 

In [3]: out
Out[3]: 
array(['Bombay', 'Delhi', 'Adelaide', 'Bombay', 'Delhi', 'Adelaide',
       'Cologne'], 
      dtype='|S8')

In [4]: sort_idx = np.argsort(transdict.keys())
   ...: idx = np.searchsorted(transdict.keys(),abc_array,sorter = sort_idx)
   ...: out = np.asarray(transdict.values())[sort_idx][idx]
   ...: 

In [5]: out
Out[5]: 
array(['Bombay', 'Delhi', 'Adelaide', 'Bombay', 'Delhi', 'Adelaide',
       'Cologne'], 
      dtype='|S8')
Run Code Online (Sandbox Code Playgroud)

  • 对于 Python 3,“keys()”和“values()”都必须包含在“list”语句中。 (2认同)