¿Por qué Numpy.all () y any () dan resultados incorrectos si usa expresiones generadoras?

Trabajando con el código de otra persona, me topé con este problema. Entonces, ¿cuál es la explicación para el comportamiento de numpy?

In [1]: import numpy as np In [2]: foo = [False, False] In [3]: print np.any(x == True for x in foo) True # <- bad numpy! In [4]: print np.all(x == True for x in foo) True # <- bad numpy! In [5]: print np.all(foo) False # <- correct result 

ps. Obtuve el código de comprensión de la lista desde aquí: compruebe si la lista contiene solo el elemento x

np.any y np.all no funcionan en generadores. Necesitan secuencias. Cuando se les da una no secuencia, tratan esto como cualquier otro objeto y llaman a bool en él (o hacen algo equivalente), lo que devolverá True :

 >>> false = [False] >>> np.array(x for x in false) array( at 0x31193c0>, dtype=object) >>> bool(x for x in false) True 

Sin embargo, la lista de trabajos de comprensión funciona:

 >>> np.all([x for x in false]) False >>> np.any([x for x in false]) False 

Aconsejo el uso de Python en any y all cuando se espera que los generadores, ya que suelen ser más rápidos que usar NumPy y listas de comprensión (debido a una doble conversión, primero a la list , luego a la array ).