In Python dicts are a natural choice for mapping from keys to values. NumPy has
no direct equivalent of a dict. But it does have arrays which can do fast integer indexing. For example,
In [153]: keyarray = np.array(['S','M','L','XL'])
In [158]: data = np.array([[0,2,1], [1,3,2]])
In [159]: keyarray[data]
Out[159]:
array([['S', 'L', 'M'],
['M', 'XL', 'L']],
dtype='|S2')
So if we could massage your key array into one that looked like this:
In [161]: keyarray
Out[161]:
array(['', '', '', '', '', '', '', '', '', '', 'S', 'S', 'S', 'M', 'L',
'S', 'S', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', 'XL', 'M', 'XL', 'S'],
dtype='|S32')
So that 10 maps to 'S' in the sense that keyarray[10] equals S, and so forth:
In [162]: keyarray[10]
Out[162]: 'S'
then we could produce the desired result with keyarray[data].
import numpy as np
data = np.array( [[ 13., 15., 15., 15., 15., 16.],
[ 14., 13., 14., 13., 15., 16.],
[ 16., 13., 13., 13., 15., 17.],
[ 14., 15., 14., 14., 14., 13.],
[ 15., 15 , 16., 16., 15., 14.],
[ 14., 13., 16., 16., 16., 16.]])
key = np.array([[ 10., 'S'],
[ 11., 'S'],
[ 12., 'S'],
[ 13., 'M'],
[ 14., 'L'],
[ 15., 'S'],
[ 16., 'S'],
[ 17., 'XL'],
[ 92., 'XL'],
[ 93., 'M'],
[ 94., 'XL'],
[ 95., 'S']])
idx = np.array(key[:,0], dtype=float).astype(int)
n = idx.max()+1
keyarray = np.empty(n, dtype=key[:,1].dtype)
keyarray[:] = ''
keyarray[idx] = key[:,1]
data = data.astype('int')
print(keyarray[data])
yields
[['M' 'S' 'S' 'S' 'S' 'S']
['L' 'M' 'L' 'M' 'S' 'S']
['S' 'M' 'M' 'M' 'S' 'XL']
['L' 'S' 'L' 'L' 'L' 'M']
['S' 'S' 'S' 'S' 'S' 'L']
['L' 'M' 'S' 'S' 'S' 'S']]
Note that data = data.astype('int') is assuming that the floats in data can be uniquely mapped to ints. That appears to be the case with your data, but it is not true for arbitrary floats. For example, astype('int') maps both 1.0 and 1.5 map to 1.
In [167]: np.array([1.0, 1.5]).astype('int')
Out[167]: array([1, 1])
dataas it's wrong (missing commas). This can confuse other users of the data type.print(repr(data))