2012-03-05 13 views
14

Estoy buscando una función numpy para encontrar los índices en los que se encuentran ciertos valores dentro de un vector (xs). Los valores se dan en otra matriz (ys). Los índices devueltos deben seguir el orden de ys.Buscar valores múltiples dentro de una matriz Numpy

En el código, quiero reemplazar la lista de comprensión a continuación por una función numpy.

>> import numpy as np 
>> xs = np.asarray([45, 67, 32, 52, 94, 64, 21]) 
>> ys = np.asarray([67, 94]) 
>> ndx = np.asarray([np.nonzero(xs == y)[0][0] for y in ys]) # <---- This line 
>> print(ndx) 
[1 4] 

¿Hay una manera rápida?

Gracias

+0

Will 'ys' be very long? – kennytm

Respuesta

21

para grandes matrices xs y ys, que tendrían que cambiar el enfoque básico para que esto sea rápido. Si usted está muy bien con la clasificación xs, a continuación, una opción fácil es utilizar numpy.searchsorted():

xs.sort() 
ndx = numpy.searchsorted(xs, ys) 

Si es importante para mantener el orden original de xs, puede utilizar este enfoque, también, pero hay que recordar la índices originales:

orig_indices = xs.argsort() 
ndx = orig_indices[numpy.searchsorted(xs[orig_indices], ys)] 
+1

si no necesita realizar un seguimiento de qué elementos se encontraron y cuáles no se pueden filtrar los resultados para deshacerse de todos los índices más allá de los límites: ndx = [e para e en np.searchsorted (xs, ys) if e Picarus

Cuestiones relacionadas