Numpy int array: Encuentre índices de múltiples ints de destino.

Tengo una gran matriz numpy ( dtype=int ) y un conjunto de números que me gustaría encontrar en esa matriz, por ejemplo,

 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] 

La matriz de result no tiene que ser ordenada.

La velocidad es un problema, y ​​dado que tanto los values como los values searchvals pueden ser grandes,

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

no lo corta

¿Alguna pista?

¿Es esto lo suficientemente rápido?

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

Yo diría que usar np.in1d sería la solución intuitiva para resolver tal caso. Dicho esto, basado en this solution aquí hay una alternativa con 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] 

¿Se puede evitar entumecer todos juntos? La concatenación de listas debería ser mucho más rápida que confiar en los métodos de numpy. Esto seguirá funcionando incluso si los values deben ser una matriz numpy.

 result = [] for sv in searchvals: result += [i for i in range(len(values)) if values[i] == sv]