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数组之前,您可以始终使用
&
长时间使用它。。。