¿Cómo usar un diccionario para traducir / reemplazar elementos de una matriz?

Tengo una matriz numpy, que tiene cientos de elementos que son letras mayúsculas, sin ningún orden en particular

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

Cada elemento en este numpy.ndarray es un numpy.string_ .

También tengo un “diccionario de traducción”, con pares clave / valor de modo que la letra mayúscula corresponda a una ciudad

 transdict = {'A': 'Adelaide', 'B': 'Bombay', 'C': 'Cologne',...} 

Solo hay 26 pares en el diccionario del diccionario, pero hay cientos de letras en la matriz numpy que debo traducir.

¿Cuál es la forma más eficiente de hacer esto?

He considerado usar numpy.core.defchararray.replace(a, old, new, count=None)[source] pero esto devuelve un ValueError , ya que la matriz numpy tiene un tamaño diferente al de las claves / valores del diccionario.

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

¿Con esto bastará? A veces, Python simple es una forma buena y directa de manejar tales cosas. Lo siguiente construye una lista de traducciones (convertidas fácilmente a una matriz numpy) y la salida unida.

 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) 

La salida de esto es:

 Bombay Dresden Adelaide Formosa Hague Inchon Zambia Jakarta 

Con NumPy broadcasting fuerza bruta NumPy broadcasting

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

Con np.searchsorted basado en la búsqueda y la indexación –

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

Ejecución de la muestra

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