Comprobando si una matriz es elemento de una lista de matrices

Tengo 13 matrices de python NumPy:

obj_1=np.array([784,785,786,787,788,789,790,791,792]) obj_2=np.array([716,717,718,730,731,732,721,722,724,726,727]) obj_3=np.array([658,659,660,661,662,663,664,665]) obj_4=np.array([581,582,583,589,590,591,595,597,598,599,601,605,606,613,614]) obj_5=np.array([533,534,535,536,537]) obj_6=np.array([464,469,472,474]) obj_7=np.array([406,409,411,412]) obj_8=np.array([345,346,347,349]) obj_9=np.array([277,278,281,282,283,284,288,296]) obj_10=np.array([217,219,220,223,224]) obj_11=np.array([154,155,156,157,158,159,160,161]) obj_12=np.array([91,92,93,94,95,96,97]) obj_13=np.array([28,29,30,31,32,33,34]) 

Entonces el siguiente bucle:

 for i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9, obj_10, obj_11, obj_12, obj_13]: print i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9] 

Yo esperaría esta salida:

 True True True True True True True True True False False False False 

En su lugar me sale lo siguiente con un error:

 True True True True True True Traceback (most recent call last): File "", line 16, in  print i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9] ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Probé diferentes arreglos con los mismos nombres y lo mismo para loop; no produjeron ningún error.

Parece que el problema radica en el contenido de las matrices, pero no pude averiguar dónde.

¿Alguien tiene una idea de por qué sucede esto?

Cuando haces obj in list python compara obj para la igualdad con cada uno de los miembros de la lista. El problema es que el operador de igualdad en numpy no se comporta de manera consistente. Por ejemplo:

 >>> obj_3 == obj_6 False 

Debido a que tienen diferentes longitudes, se devuelve un booleano.

 >>> obj_7==obj_6 array([False, False, False, False], dtype=bool) 

Debido a que tienen la misma longitud, las matrices se comparan de forma inteligente y se devuelve una matriz numpy. En este caso el valor de verdad es indeterminado. Parece que este extraño comportamiento va a cambiar en el futuro .

La forma correcta de hacerlo sería comparar individualmente cada par de matrices utilizando, por ejemplo, numpy.array_equal :

 for i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9, obj_10, obj_11, obj_12, obj_13]: print any(np.array_equal(i, j) for j in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9]) 

te atrapa

 True True True True True True True True True False False False False