Python 使用numpy数组左移位1

Python 使用numpy数组左移位1,python,arrays,python-2.7,numpy,bit-shift,Python,Arrays,Python 2.7,Numpy,Bit Shift,Python确实可以通过大整数稍微左移 1L << 100 # 1267650600228229401496703205376L 有没有办法用NumPy的左移位操作来克服这个问题?单独访问数组元素会产生相同的错误结果: 1L << a[2] # 68719476736 1LPythonlong值与a中保存的整数的类型不同。具体来说,Pythonlong值不限于32位或64位,而是可以占用任意数量的内存 另一方面,NumPy将创建a作为int32或int64整数值的数组

Python确实可以通过大整数稍微左移

1L << 100
# 1267650600228229401496703205376L
有没有办法用NumPy的左移位操作来克服这个问题?单独访问数组元素会产生相同的错误结果:

1L << a[2]
# 68719476736

1LPython
long
值与
a
中保存的整数的类型不同。具体来说,Python
long
值不限于32位或64位,而是可以占用任意数量的内存

另一方面,NumPy将创建
a
作为
int32
int64
整数值的数组。当您左移这个数组时,您会得到一个相同数据类型的数组。这没有足够的内存来容纳
1这也是64位Python的一个问题,除了成为问题的整数更大之外。如果您运行
a[2]=1L>>a=np.array([1,2100],dtype='O')
>>>a[2]=1L>>a
数组([1,2,1267650600228229401496703205376L],数据类型=对象)

给定您创建的数组
a
输出的元素将是整数。与Python本身不同,numpy darray中的整数大小固定,具有定义的最大值和最小值


numpy是通过将移位模与整数的长度(64位,100 mod 64==36)相减而得到给定的值(
2**36
)。

一个小的修正:python中的整数(如
int
,但文档使用
integer
在某种程度上是
int
的同义词)
long
s按您所述操作。也就是说,这里的代码使用
long
类型,如果您的文本对于
int
来说太大,python则使用
long
。你的陈述让我很困惑,我想让其他人看看@kratenko——谢谢你,我应该说得更清楚。我想到了Python3,在那里,
long
类型已经消失了(我现在看到问题被标记为Python2.7)。啊,关于Python3,我不知道这一点。我真的应该在不久的将来看一看3……说“Python 3中的
long
类型已经消失了”可能会产生误导。在Python3中,内置的
int
类型在大小上没有理论上限,因此本质上
long
已集成到
int
中。
1L << a[2]
# 68719476736
>>> np.left_shift(1, a.astype(object))
array([2, 4, 1267650600228229401496703205376L], dtype=object)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long
>>> a = np.array([1,2,100],dtype='O')
>>> a[2]=1L << a[2]
>>> a
array([1, 2, 1267650600228229401496703205376L], dtype=object)