How to use a dictionary to translate/replace elements of an array? [duplicate] How to use a dictionary to translate/replace elements of an array? [duplicate] numpy numpy

How to use a dictionary to translate/replace elements of an array? [duplicate]


Will this do? Sometimes, plain Python is a good, direct way to handle such things. The below builds a list of translations (easily converted back to a numpy array) and the joined output.

import numpy as npabc_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)

The output from this is:

Bombay Dresden Adelaide Formosa Hague Inchon Zambia Jakarta


With brute-force NumPy broadcasting -

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

With np.searchsorted based searching and indexing -

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

Sample run -

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]: outOut[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]: outOut[5]: array(['Bombay', 'Delhi', 'Adelaide', 'Bombay', 'Delhi', 'Adelaide',       'Cologne'],       dtype='|S8')