numpy中的Unicode元素字符串比较

时间:2016-01-29 13:39:43

标签: python arrays numpy unicode python-2.x

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

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

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

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

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

u'yes' == x
#op : False

我无法在numpy文档中找到此行为的详细信息,并希望有人可以向我解释或指出为什么与unicode字符串的比较行为不同的详细信息?

1 个答案:

答案 0 :(得分:5)

相关信息是Python's coercion rules

的这一部分
  

对于对象xy,首先尝试x.__op__(y)。如果未执行此操作或返回NotImplemented,则会尝试y.__rop__(x)

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

  • 'yes'.__eq__(x)返回NotImplemented
  • 因此解析为x.__eq__('yes') - 导致numpy的元素比较。

但是,当左侧是unicodeu'yes' == x)时:

  • u'yes'.__eq__(x)只返回False

__eq__行为不同的原因是,如果str.__eq__()的参数不是NotImplemented类型,str只返回unicode.__eq__(),而unicode首先尝试将其参数转换为NotImplemented,如果转换失败,则仅返回unicode。在这种情况下,numpy数组可以转换为u'yes' == xu'yes' == unicode(x)本质上是mWidth = GetDeviceCaps(hScreenDC, HORZRES); mHeight = GetDeviceCaps(hScreenDC, VERTRES); mWxHxS = mWidth*mHeight*4; bi.bmiHeader.biBitCount = 32; hBitmap = CreateCompatibleBitmap(hScreenDC, mWidth, mHeight); if(BitBlt( hMemoryDC, 0, 0, mWidth, mHeight, hScreenDC, mPx, mPy, SRCCOPY | CAPTUREBLT ) && GetDIBits(hScreenDC, hBitmap, 0, mHeight, mImageBuffer, &bi, DIB_RGB_COLORS)) { return true; }