Предположим, у меня есть список имен
names = ['Alex','Brad', 'Camilla']
Если бы у меня был массив numpy, например
norder = array([0, 1, 2, 1, 0, 1, 0, 2, 1, 1])
Тогда я мог бы использовать norder
для доступа к names
, выполнив
names[norder]
>>> array(['Alex', 'Brad', 'Camilla', 'Brad', 'Alex', 'Brad', 'Alex',
'Camilla', 'Brad', 'Brad'], dtype='<U7')
Как мне пойти в обратном направлении? Дано
order= array(['Alex', 'Brad', 'Camilla', 'Brad', 'Alex', 'Brad', 'Alex', 'Camilla', 'Brad', 'Brad'], dtype='<U7')
и names
, как мне вернуть что-то похожее на norder
?
Один параметр с numpy использует широковещательное сравнение.
>>> (np.array(names) == order[:, None]).argmax(1)
array([0, 1, 2, 1, 0, 1, 0, 2, 1, 1])
Быть быстрым, недостатком здесь является то, что он интенсивно используется в памяти.
В качестве альтернативы можно с помощью панд Index
API:
>>> import pandas as pd
>>> idx = pd.Index(names)
>>> idx.get_indexer(order)
array([0, 1, 2, 1, 0, 1, 0, 2, 1, 1])
Это должно быть гораздо более эффективным с точки зрения памяти.
(np.array(names) == order[:, None]).argmax(1)
names
и в указанном порядке? Для конкретного примера вы предоставилиpd.factorize(order)[0]
.