2016-01-29 22 views
5

Ho avuto una domanda sul confronto di uguaglianza con numpy e array di stringhe. dire che io definisco il seguente array:Unicode confronto stringhe elementwise in numpy

x = np.array(['yes', 'no', 'maybe']) 

allora posso verificare l'uguaglianza con altre stringhe e lo fa elemento saggio rispetto alla singola stringa (in seguito, credo, le regole di radiodiffusione qui: http://docs.scipy.org/doc/numpy-1.10.1/user/basics.broadcasting.html?):

'yes' == x 
#op : array([ True, False, False], dtype=bool) 

x == 'yes' 
#op : array([ True, False, False], dtype=bool) 

Tuttavia, se confronto con le stringhe Unicode ottengo un comportamento diverso con elemento saggio confronto solo succede se confronto la matrice alla stringa e solo un singolo confronto viene fatto se confronto la stringa alla matrice.

x == u'yes' 
#op : array([ True, False, False], dtype=bool) 

u'yes' == x 
#op : False 

non riesco a trovare i dettagli di questo comportamento nella documentazione NumPy e speravo che qualcuno potesse spiegare o punto me dettagli del perché il confronto con le stringhe Unicode comporta in modo diverso?

+0

Che dire di 'u'yes '== np.array ([u'yes', u'no ', u'ay'])'? – hpaulj

+0

Si comporta allo stesso modo per motivi @ 一 二三 la risposta sotto spiega. _i.e.:_ 'u'yes '== np.array ([u'yes', u'no ', u'maybe'])' restituisce 'False' e' np.array ([u 'yes', u'no ', u'be') ')) == u'yes'' restituisce 'array ([True, False, False], dtype = bool)' –

risposta

5

Il pezzo importante di informazioni è questa parte del Python's coercion rules:

Per oggetti x e y, prima x.__op__(y) viene provato. Se questo non è implementato o restituisce NotImplemented, si prova con y.__rop__(x).

Utilizzando l'array NumPy x, quando il lato sinistro è una str ('yes' == x):

  • 'yes'.__eq__(x) rendimenti NotImplemented e
  • risolve quindi x.__eq__('yes') - con conseguente confronto elemento-saggio di numpy .

Tuttavia, quando la sinistra è una unicode (u'yes' == x):

  • u'yes'.__eq__(x) restituisce semplicemente False.

La ragione per i diversi comportamenti __eq__ è che str.__eq__() restituisce semplicemente NotImplemented se il suo argomento non è un tipo str, mentre unicode.__eq__() primi tentativi di convertire il suo argomento a un unicode, e restituisce solo NotImplemented se quella conversione non riesce. In questo caso, la matrice numpy è convertibile in unicode: u'yes' == x è essenzialmente u'yes' == unicode(x).