2016-02-14 36 views
5

Per esempio, cercando di dare un senso a questi risultati:Quali sono le regole per confrontare gli array numpy usando ==?

>>> 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 
>>> 

Che cosa sta succedendo qui? Nel caso di [1], confronta 1 con ciascun elemento di x e aggrega il risultato in una matrice. Nel caso di [[1]], stessa cosa. È facile capire che cosa accadrà per forme di array specifiche semplicemente sperimentando sul repl. Ma quali sono le regole di base in cui entrambe le parti possono avere forme arbitrarie?

risposta

4

NumPy tenta di trasmettere i due array a forme compatibili prima del confronto. Se la trasmissione fallisce, False è attualmente restituito. In the future,

L'operatore di uguaglianza == sarà in futuro generare errori come np.equal se radiodiffusione o elemento confronti, ecc fallisce.

In caso contrario, viene restituito un array booleano risultante dal confronto elemento per elemento. Ad esempio, poiché x e np.array([1]) sono broadcastable, una matrice di forma (10,) viene restituito:

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

Da x e np.array([[1,3],[2]]) non sono broadcastable, False viene restituito da x == np.array([[1,3],[2]]).

In [50]: np.broadcast(x, np.array([[1,3],[2]])).shape 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-50-56e4868cd7f7> in <module>() 
----> 1 np.broadcast(x, np.array([[1,3],[2]])).shape 

ValueError: shape mismatch: objects cannot be broadcast to a single shape 
3

E 'possibile che ciò che si confonde è che:

  1. alcuni broadcasting sta succedendo.

  2. sembra che tu abbia una versione precedente di numpy.


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

sta trasmettendo. Confronta x in ciascun primo e secondo array; poiché sono scalari, la trasmissione implica che confronta ogni elemento di x con ciascuno degli scalari.


Tuttavia, ognuno di

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

e

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

non può essere trasmesso. Da parte mia, con numpy 1.10.4, questo dà

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