cómo encontrar índices de una matriz numérica 2d que se produce en otra matriz 2d [duplicado]

Nov 25 2020

Tengo dos matrices numpy 2d y quiero encontrar dónde está ocurriendo una matriz en otra:

big_array = np.array([[1., 2., 1.2], [5., 3., 0.12], [-1., 14., 0.], [-9., 0., 13.]])
small_array= np.array([[5., 3., 0.12], [-9., 0., 13.]])

Luego quiero obtener los índices de las filas big_arrayque son iguales a las filas de small_array. Quiero hacer algo como np.in1dpara matrices 2d. Quiero decir, quiero tener:

result= [1, 3]

Ya probé el siguiente código pero no fue exitoso:

result=[([any(i == big_array ) for i in small_array])]

De antemano, agradezco cualquier ayuda.

Respuestas

1 Djib2011 Nov 25 2020 at 08:56

Lo que quieres es:

sum([row in small_array for row in big_array])

Ejemplo:

import numpy as np
big_array = np.array([[1., 2., 1.2], [5., 3., 0.12], [-1., 14., 0.], [-9., 0., 13.]])
small_array= np.array([[5., 3., 0.12], [-1., 14., 0.]])

result = sum([row in small_array for row in big_array])
print(result)

2


Editar (después de aclaraciones):

Una solución pitónica:

[i for i, brow in enumerate(big_array) for srow in small_array if all(srow == brow)]

Ejemplo:

big_array = np.array([[1., 2., 1.2], [5., 3., 0.12], [-1., 14., 0.], [-9., 0., 13.]])
small_array= np.array([[5., 3., 0.12], [-1., 14., 0.]])

result = [i for i, brow in enumerate(big_array) for srow in small_array if all(srow == brow)]

print(result)

[1, 2]

Nota : probablemente podría hacer algo mejor con np.where, si tiene matrices enormes, debería buscarlo