Поиск индексов элементов поиска в массиве NumPy - PullRequest
0 голосов
/ 09 июня 2018

Я хочу идентифицировать индексы в моем массиве, значение которого является одним из значений, содержащихся в наборе;например, это установило мое be (5,6,7,8).

Сейчас я делаю

np.where(np.isin(arr, [5,6,7,8]))

, который работает отлично.Мне было интересно, есть ли лучший способ достичь этой функциональности.

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Ваш подход действителен, и он также работает для многомерных массивов.

x = np.arange(9.).reshape(3, 3)
>>> goodvalues = [3, 4, 7]
>>> ix = np.isin(x, goodvalues)
>>> ix
array([[False, False, False],
      [ True,  True, False],
      [False,  True, False]], dtype=bool)
>>> np.where(ix)
(array([1, 1, 2]), array([0, 1, 1]))

Это прямо из документации здесь: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.where.html#numpy.where

0 голосов
/ 09 июня 2018

Вы не можете знать, является ли ваше текущее решение хорошим или нет, если вы не знаете, какие есть альтернативы.

Во-первых,

np.where(np.isin(arr, val))

Работает для любого общего случая.np.isin выполняет линейный поиск по arr для элементов в val.

Вы также можете заменить np.where на np.nonzero, что немного быстрее для больших N.

Далее, есть

(arr[:, None] == val).argmax(0)

То есть очень быстро для малых размеров arr и val (N <100). </p>

Наконец, если arr отсортировано, я рекомендую np.searchsorted.

np.searchsorted(arr, val)

arr = np.arange(100000)
val = np.random.choice(arr, 1000)

%timeit np.where(np.isin(arr, val))
%timeit np.nonzero(np.isin(arr, val))
%timeit (arr[:, None] == val).argmax(0)
%timeit np.searchsorted(arr, val)

8.3 ms ± 320 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
7.88 ms ± 791 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
861 ms ± 6.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
235 µs ± 31.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Проблема с (arr[:, None] == val).argmax(0) заключается в выбросе памяти - сравнение транслируется, вводя очень, очень разреженную матрицу, которая расточительна при большом N (поэтому не используйте его для большихN).

0 голосов
/ 09 июня 2018

Код у вас правильный и разумный.Вы должны сохранить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...