2016-07-08 1 views
6

у меня есть большой массив Numpy (dtype=int) и набор чисел, которые я хотел бы найти в этом массиве, например,Numpy целочисленный массив: Найти индексы нескольких целевых Интс

import numpy as np 
values = np.array([1, 2, 3, 1, 2, 4, 5, 6, 3, 2, 1]) 
searchvals = [3, 1] 
# result = [0, 2, 3, 8, 10] 

result массив не нужно сортировать.

Скорость является проблемой, и так как values и searchvals могут быть большими,

for searchval in searchvals: 
    np.where(values == searchval)[0] 

не режет его.

Любые подсказки?

+0

Какой должен быть формат выходного массива? Из-за разных выходных длин на каждой итерации он не может быть сохранен в массиве регулярной формы IIUC. Или мы можем конгломератировать все в одном массиве 1D? – Divakar

+0

В идеале я приведу массив индексов (например, 'result' в примере). –

+0

Ах, милый! Не заметил этого. – Divakar

ответ

5

Это достаточно быстро?

>>> np.where(np.in1d(values, searchvals)) 
(array([ 0, 2, 3, 8, 10]),) 
1

Я бы сказал using np.in1d бы интуитивное решение для решения такого случая. Сказав, что, основываясь на this solution здесь альтернатива с np.searchsorted -

sidx = np.argsort(searchvals) 
left_idx = np.searchsorted(searchvals,values,sorter=sidx,side='left') 
right_idx = np.searchsorted(searchvals,values,sorter=sidx,side='right') 
out = np.where(left_idx != right_idx)[0] 
0

Можно ли избежать NumPy все вместе? Конкатенация списков должна быть намного быстрее, чем полагаться на методы numpy. Это будет работать, даже если values должен быть массивом numpy.

result = [] 
for sv in searchvals: 
    result += [i for i in range(len(values)) if values[i] == sv] 
Смежные вопросы