2016-01-29 11 views
5

Ich hatte eine Frage über Gleichheitsvergleich mit numpy und Arrays von Strings. sagen, dass ich die folgende Reihe zu definieren:Unicode elementweise Zeichenfolgevergleich in numpy

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

Dann kann ich für die Gleichstellung mit anderen Zeichenfolge testen und es tut Element wiese Vergleich mit der Einzelsaite (nach, ich denke, die Rundfunk-Regeln hier: 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) 

wenn ich jedoch mit Unicode-Strings zu vergleichen, bekomme ich ein anderes Verhalten mit dem Element weiser Vergleich geschieht nur, wenn ich das Array zu dem String zu vergleichen und nur ein einziger Vergleich durchgeführt wird, wenn ich die Zeichenfolge in dem Array zu vergleichen.

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

u'yes' == x 
#op : False 

Ich kann nicht Details dieses Verhalten in den numpy docs finden und hatte gehofft, jemand könnte mir erklären oder zeigen auf Details, warum Vergleich mit Unicode-Strings anders verhält?

+0

Was ist mit 'u'yes' == np.array ([u'yes, u'no ', u'maybe']) '? – hpaulj

+0

Es verhält sich auf die gleiche Weise aus Gründen @ 一 二三 Antwort unten erläutert. _i.e.:_ 'u'yes == np.array ([u'yes, u'no, u'maybe '])' gibt 'False' und' np.array ([u "Ja", "Nein", "Vielleicht") == Du gibst "Array" zurück ([True, False, False], dtype = bool) ' –

Antwort

5

Die relevante Information ist dieser Teil des Python's coercion rules:

Für Objekte x und y zunächst x.__op__(y) versucht. Wenn dies nicht implementiert ist oder NotImplemented zurückgibt, wird y.__rop__(x) versucht.

x Ihre numpy Array verwenden, wenn die linke Seite ist ein str ('yes' == x):

  • 'yes'.__eq__(x) kehrt NotImplemented und
  • daher beschließen, x.__eq__('yes') - was zu numpy des Element weist Vergleich .

Wenn jedoch die linke Seite ist eine unicode (u'yes' == x):

  • u'yes'.__eq__(x) gibt einfach False.

Der Grund für das unterschiedliche __eq__ Verhalten ist, dass str.__eq__() gibt einfach NotImplemented wenn ihr Argument keinen str Typ ist, während unicode.__eq__() versucht zunächst das Argument in ein unicode, zu konvertieren und liefert nur NotImplemented wenn die Konvertierung fehlschlägt. In diesem Fall ist das numpy Array in eine unicode umwandelbar: u'yes' == x ist im Wesentlichen u'yes' == unicode(x).

Verwandte Themen