numpy中的Unicode元素字符串比较

jay*_*bee 5 python arrays unicode numpy python-2.x

我有一个关于与numpy和字符串数组进行相等比较的问题.假设我定义了以下数组:

x = np.array(['yes', 'no', 'maybe'])
Run Code Online (Sandbox Code Playgroud)

然后我可以测试与其他字符串的相等性,并且它与单个字符串进行元素明智的比较(以下,我认为,这里的广播规则: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)
Run Code Online (Sandbox Code Playgroud)

但是,如果我与unicode字符串进行比较,我会得到不同的行为,只有当我将数组与字符串进行比较时才会发生元素明智的比较,如果我将字符串与数组进行比较,则只进行一次比较.

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

u'yes' == x
#op : False
Run Code Online (Sandbox Code Playgroud)

我在numpy docs中找不到这种行为的细节,并希望有人可以解释或指出为什么与unicode字符串的比较行为不同的细节?

一二三*_*一二三 5

相关的信息是Python的强制规则的一部分:

对于对象xy,首先x.__op__(y)是尝试.如果没有实现或返回NotImplemented,y.__rop__(x)则尝试.

使用你的numpy数组x,当左边是a str('yes' == x)时:

  • 'yes'.__eq__(x)回归NotImplemented
  • 因此解决了x.__eq__('yes')- 导致numpy的元素比较.

但是,当左侧是unicode(u'yes' == x)时:

  • u'yes'.__eq__(x)简单地回来False.

不同__eq__行为的原因是,如果其参数不是类型,则str.__eq__()简单地返回,而首先尝试将其参数转换为a ,并且仅在该转换失败时返回.在这种情况下,numpy数组可以转换为:基本上是.NotImplementedstrunicode.__eq__()unicodeNotImplementedunicodeu'yes' == xu'yes' == unicode(x)