Obtención de los índices de varios elementos en una matriz NumPy a la vez

¿Hay alguna manera de obtener los índices de varios elementos en una matriz NumPy a la vez?

P.ej

import numpy as np a = np.array([1, 2, 4]) b = np.array([1, 2, 3, 10, 4]) 

Me gustaría encontrar el índice de cada elemento de a en b , a saber: [0,1,4] .

Encuentro la solución que estoy usando un poco verbosa:

 import numpy as np a = np.array([1, 2, 4]) b = np.array([1, 2, 3, 10, 4]) c = np.zeros_like(a) for i, aa in np.ndenumerate(a): c[i] = np.where(b==aa)[0] print('c: {0}'.format(c)) 

Salida:

 c: [0 1 4] 

Related of "Obtención de los índices de varios elementos en una matriz NumPy a la vez"

Puedes usar in1d y in1d (o where ):

 >>> np.in1d(b, a).nonzero()[0] array([0, 1, 4]) 

Esto funciona bien para sus matrices de ejemplo, pero en general la matriz de índices devueltos no respeta el orden de los valores en a . Esto puede ser un problema dependiendo de lo que quieras hacer a continuación.

En ese caso, una respuesta mucho mejor es la que @Jaime da aquí , utilizando searchsorted :

 >>> sorter = np.argsort(b) >>> sorter[np.searchsorted(b, a, sorter=sorter)] array([0, 1, 4]) 

Esto devuelve los índices para los valores tal como aparecen en a . Por ejemplo:

 a = np.array([1, 2, 4]) b = np.array([4, 2, 3, 1]) >>> sorter = np.argsort(b) >>> sorter[np.searchsorted(b, a, sorter=sorter)] array([3, 1, 0]) # the other method would return [0, 1, 3] 

Este es un sencillo de una sola línea que usa el paquete numpy indexado (descargo de responsabilidad: soy su autor):

 import numpy_indexed as npi idx = npi.indices(b, a) 

La implementación está completamente vectorizada y le da control sobre el manejo de los valores faltantes. Además, también funciona para nd-arrays (por ejemplo, para encontrar los índices de filas de a en b).

Para una solución np.flatnonzero de np.isin , puede usar np.flatnonzero con np.isin (v 1.13+).

 import numpy as np a = np.array([1, 2, 4]) b = np.array([1, 2, 3, 10, 4]) res = np.flatnonzero(np.isin(a, b)) # NumPy v1.13+ res = np.flatnonzero(np.in1d(a, b)) # earlier versions # array([0, 1, 2], dtype=int64)