В dicts Python является естественным выбором для отображения от ключей до значений. NumPy имеет никакого прямого эквивалента dict. Но у него есть массивы, которые могут выполнять быстрое целочисленное индексирование. Например,
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')
Так что, если мы могли бы помассировать key
массив в один, который выглядит следующим образом:
In [161]: keyarray
Out[161]:
array(['', '', '', '', '', '', '', '', '', '', 'S', 'S', 'S', 'M', 'L',
'S', 'S', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', 'XL', 'M', 'XL', 'S'],
dtype='|S32')
Так что 10 карт на «S» в том смысле, что keyarray[10]
равно S
, и так :
In [162]: keyarray[10]
Out[162]: 'S'
Тогда мы сможем получить желаемый результат с 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])
дает
[['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']]
Обратите внимание, что data = data.astype('int')
при условии, что поплавки в data
может быть однозначно отображается в int
с. Это похоже на ваши данные, но это неверно для произвольных поплавков. Например, astype('int')
отображает как 1.0, так и 1.5 на 1.
In [167]: np.array([1.0, 1.5]).astype('int')
Out[167]: array([1, 1])
Пожалуйста, исправьте фрагмент кода для 'data', так как это неправильно (пропуски). Это может запутать других пользователей типа данных. – ha9u63ar
S, M, L ... имена переменных или строки? –
они являются строками .. – Amistad