¿Cuáles son las reglas para comparar arrays numpy usando ==?

Por ejemplo, tratando de dar sentido a estos resultados:

>>> x array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> (x == np.array([[1],[2]])).astype(np.float32) array([[ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32) >>> (x == np.array([1,2])) False >>> (x == np.array([[1]])).astype(np.float32) array([[ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32) >>> (x == np.array([1])).astype(np.float32) array([ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32) >>> (x == np.array([[1,3],[2]])) False >>> 

¿Que está pasando aqui? En el caso de [1], se compara 1 con cada elemento de x y se agrega el resultado en una matriz. En el caso de [[1]], lo mismo. Es fácil darse cuenta de lo que ocurrirá con formas de matrices específicas simplemente experimentando en la respuesta. Pero, ¿cuáles son las reglas subyacentes donde ambas partes pueden tener formas arbitrarias?

NumPy intenta transmitir las dos matrices a formas compatibles antes de la comparación. Si la transmisión falla, se devuelve False actualmente. En el futuro ,

En el futuro, el operador de igualdad == generará errores como np.equal si falla la transmisión o la comparación de elementos, etc.

De lo contrario, se devuelve una matriz booleana que resulta de la comparación elemento por elemento. Por ejemplo, como x y np.array([1]) pueden emitir, se devuelve una matriz de forma (10):

 In [49]: np.broadcast(x, np.array([1])).shape Out[49]: (10,) 

Como x y np.array([[1,3],[2]]) no se pueden emitir, False se devuelve con x == np.array([[1,3],[2]]) .

 In [50]: np.broadcast(x, np.array([[1,3],[2]])).shape --------------------------------------------------------------------------- ValueError Traceback (most recent call last)  in () ----> 1 np.broadcast(x, np.array([[1,3],[2]])).shape ValueError: shape mismatch: objects cannot be broadcast to a single shape 

Es posible que lo que te está confundiendo es que:

  1. algo de transmisión está en marcha.

  2. Parece que tienes una versión anterior de numpy.


 x == np.array([[1],[2]]) 

esta transmitiendo Compara x con cada uno de los arreglos primero y segundo; como son escalares, la difusión implica que compara cada elemento de x con cada uno de los escalares.


Sin embargo, cada uno de

 x == np.array([1,2]) 

y

 x == np.array([[1,3],[2]]) 

no puede ser transmitido Por mi, con numpy 1.10.4, esto da

 /usr/local/bin/ipython:1: DeprecationWarning: elementwise == comparison failed; this will raise an error in the future. #!/usr/bin/python False