Windows NumPy按位“;及;int32&;长,但不是长&;int32;为什么?
比较一下:Windows NumPy按位“;及;int32&;长,但不是长&;int32;为什么?,windows,python-2.7,numpy,long-integer,bitwise-operators,Windows,Python 2.7,Numpy,Long Integer,Bitwise Operators,比较一下: >>> import numpy; numpy.int32(-1) & 0xFFFFFFFF00000000 TypeError: ufunc 'bitwise_and' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'' 为此:
>>> import numpy; numpy.int32(-1) & 0xFFFFFFFF00000000
TypeError: ufunc 'bitwise_and' not supported for the input types, and the inputs
could not be safely coerced to any supported types according to the casting rule ''safe''
为此:
>>> import numpy; 0xFFFFFFFF00000000 & numpy.int32(-1)
18446744069414584320L
两者是否都按预期工作,或者至少其中一个是bug?为什么会发生这种情况?区别在于调用对象的
\uuuu和
或\uuuu和方法。通常,左手表达式的\uuuuu和uuu
先被调用。如果它返回NotImplemented
,则右侧表达式将有机会(并且将调用\uuuuu\uuuu
)
在本例中,numpy.int32
决定不能用long来“AND”——至少不能用值高于本机类型所能表示值的long来“AND”
然而,根据您的实验,python的long
很乐意使用numpy.int32
--或者,您的numpy版本可能没有实现\uu rand\uuuu
与\uu和uuu
对称。这也可能与python版本有关(例如,如果您的python版本决定返回一个值,而不是未实现
)
在我的计算机上,这两个选项都不起作用:
Python 2.7.12 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:43:17)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> import numpy
>>> numpy.__version__
'1.11.2'
但我们可以使用以下脚本查看调用的内容:
import sys
import numpy
class MyInt32(numpy.int32):
def __and__(self, other):
print('__and__')
return super(MyInt32, self).__and__(other)
def __rand__(self, other):
print('__rand__')
return super(MyInt32, self).__and__(other)
try:
print(MyInt32(-1) & 0xFFFFFFFF00000000) # Outputs `__and__` before the `TypeError`
except TypeError:
pass
try:
print(0xFFFFFFFF00000000 & MyInt32(-1)) # Outputs `__rand__` before the `TypeError`
except TypeError:
pass
sys.maxint & MyInt32(-1) # Outputs `__rand__`
print('great success')
(sys.maxint + 1) & MyInt32(-1) # Outputs `__rand__`
print('do not see this')
两者都会在numpy 1.11.1和1.12.1中产生TypeError。在1.6.2中,第一个给出了18446744069414584320L
,但第二个:TypeError:long和'numpy.int32'的操作数类型不受支持。
@kennytm:不是我在1.12.1中看到的。。。你在Windows上吗?@Mehrdad macOS,Python 2.7.13。检查你的numpy.\uuuu版本\uuuuuu
?@kennytm:我已经检查过了,我是这样告诉你的,它是1.12.1…你可能还想尝试导入numpy;打印(numpy.int32(1)和0xABCD1234EFL)
btw。。。这个长度也超出了32位的范围。@Mehrdad--是的,这很有趣。很可能它会将这两个变量都强制转换为int64
。在某些情况下,使用本机类型执行&
没有快速的方法,这可能就是numpy
拒绝执行计算的原因。您知道预期的行为是什么吗?这是我们在未来的版本中应该依靠工作(或不工作)的东西吗?@Mehrdad——基于这样一个事实,numpy的人去做所有的工作来提出一个类型错误
,在一种情况下(因为&
应该是对称的),我猜你应该采取安全的方法,并假设这是预期的。那是我的猜测。请注意(IIRC)0xFFFFFFFF
以上的任何内容都不会有任何贡献,因此在使用numpy数组之前,您可以始终使用&
长时间使用它。。。