我有一个关于与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字符串的比较行为不同的详细信息?
答案 0 :(得分:5)
相关信息是Python's coercion rules:
的这一部分对于对象
x
和y
,首先尝试x.__op__(y)
。如果未执行此操作或返回NotImplemented
,则会尝试y.__rop__(x)
。
使用你的numpy数组x
,左边是str
('yes' == x
):
'yes'.__eq__(x)
返回NotImplemented
和x.__eq__('yes')
- 导致numpy的元素比较。但是,当左侧是unicode
(u'yes' == x
)时:
u'yes'.__eq__(x)
只返回False
。 __eq__
行为不同的原因是,如果str.__eq__()
的参数不是NotImplemented
类型,str
只返回unicode.__eq__()
,而unicode
首先尝试将其参数转换为NotImplemented
,如果转换失败,则仅返回unicode
。在这种情况下,numpy数组可以转换为u'yes' == x
:u'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;
}
。