Для всех элементов в массиве Numpy вернуть их индекс в другом массиве - PullRequest
0 голосов
/ 03 ноября 2019

Учитывая массив:

big_array = np.array(['dog', 'cat', 'dog', 'dog', 'dog', 'cat', 'cat', 'dog'])

Я хочу получить позицию каждого из этих элементов в меньшем массиве:

small_array = np.array(['dog', 'cat'])

Он должен вернуть:

[0, 1, 0, 0, 0, 1, 1, 0]

Это будет эквивалентно:

[np.where(i == small_array)[0][0] for i in big_array]

Может ли это быть сделано безпонимание списка, желательно с функцией Numpy?

Ответы [ 3 ]

2 голосов
/ 03 ноября 2019

Насколько я знаю, нет функции numpy, но вы также можете сделать комбинацию argsort и searchsorted, например:

import numpy as np

big_array = np.array(['dog', 'cat', 'dog', 'dog', 'dog', 'cat', 'cat', 'dog'])

small_array = np.array(['dog', 'cat'])

sortd = np.argsort(small_array)
res = sortd[np.searchsorted(small_array[sortd], big_array)]

print(res)
# [0 1 0 0 0 1 1 0]
2 голосов
/ 03 ноября 2019

Если вы хотите отсортировать small_array, это будет сделано:

small_array.sort() # in-place, or `x = np.sort(small_array)` for a sorted copy
np.searchsorted(small_array, big_array)
0 голосов
/ 03 ноября 2019

Сравните с трансляцией и найдите индекс True в результате по последней оси.

>>> a = np.array(['dog', 'cat', 'dog', 'dog', 'dog', 'cat', 'cat', 'dog'])
>>> b = np.array(['dog','cat'])
>>> c = a[:,None] == b
>>> c.argmax(axis=-1)
array([0, 1, 0, 0, 0, 1, 1, 0], dtype=int64)

>>> a[:,None] == b
array([[ True, False],
       [False,  True],
       [ True, False],
       [ True, False],
       [ True, False],
       [False,  True],
       [False,  True],
       [ True, False]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...