Найдите массив в первом столбце матрицы с помощью numpy и получите значения следующего столбца

Имея следующие массивы (я понимаю, что первый называется матрицей)

ids = np.array([['Peter Parker','Spiderman'],['Ben Reilly','Scarlet Spider'],['Norman Osborn','Green Goblin'],['Bruce Banner','Hulk']])

А также

heroes=np.array(['Spiderman','Scarlet Spider','Capitan America','Iron Man'])

Я могу найти значения «героев», которые соответствуют строкам в «идентификаторах», но я могу распечатать только такие совпадения, как

 print(ids[np.where(ids==(np.row_stack(heroes)))])

Какие выходы

['Spiderman' 'Scarlet Spider']

Можно ли (и как) распечатать их как ?

['Peter Parker' 'Ben Reilly']

примечание Это заданное упражнение, я не ожидаю других требований, таких как количество элементов в массиве heroes, отличающееся от количества строк в массиве ids (это нарушит мой текущий код из-за использование row_stack).

Но я заметил, что мой where не будет находить повторяющиеся значения в массиве ids (например, если у меня есть 2 «Человека-паука» с разным именем, и оба имени появляются в массиве heroes), не стесняйтесь расширять это, но главный вопрос в том, что я просто писал без других заданных ограничений.


person Allende    schedule 12.03.2019    source источник


Ответы (1)


Вы можете использовать np.argwhere и индексацию, чтобы получить имена. Внутренний [:,0] дает вам два подмассива, содержащие имена, а внешний [:,0] дает вам первый элемент (имя) из каждого из подмассивов.

ids[np.argwhere(ids==(np.row_stack(heroes)))[:,0]][:, 0]
# array(['Peter Parker', 'Ben Reilly'])
person Sheldore    schedule 12.03.2019
comment
Привет, извините, но я получил аналогичный результат, выполнив ids[np.where(ids==(np.row_stack(heroes))),1][0], но я не могу знать, эквивалентно ли это как-то вашему ответу или я делаю что-то ненужное, я буду признателен за любую мысль, еще раз спасибо - person Allende; 12.03.2019
comment
@Allende: np.where и np.argwhere дают разные результаты. Для моего ответа вы должны использовать np.argwhere. Он генерирует двумерную матрицу индексов, тогда как np.where генерирует массив одномерных подмассивов. - person Sheldore; 12.03.2019