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