Получение индекса для массива numpy

1

Предположим, у меня есть список имен

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?

  • 1
    Вы можете сделать трансляцию сравнения: (np.array(names) == order[:, None]).argmax(1)
  • 0
    Будут ли использоваться все names и в указанном порядке? Для конкретного примера вы предоставили pd.factorize(order)[0] .
Показать ещё 1 комментарий
Теги:

1 ответ

2
Лучший ответ

Один параметр с 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])

Это должно быть гораздо более эффективным с точки зрения памяти.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню