在数组中执行按位左移运算时,越过了整数限制 [英] Integer limit crossed while performing bitwise left shift operation in array
问题描述
我正在使用按位左移运算符创建一个numpy数组.
I am creating a numpy array using the bitwise left shift operator.
例如,我创建数组p,其中数组的形状与矩阵a的形状相同,即(23,):
For example, I create array p, where the shape of array is same as that of matrix a i.e. (23,):
>>> import numpy
>>> a = numpy.array([0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,1,0,0,1,1])
>>> p = 1 << arange(a.shape[-1] - 1) #left shift
结果如预期:
>>> p
array([ 1, 2, 4, 8, 16, 32, 64,
128, 256, 512, 1024, 2048, 4096, 8192,
16384, 32768, 65536, 131072, 262144, 524288, 1048576,
2097152])
但是,如果我们增加数组的大小,可以说是(70,):
But, if we increase the size of array, let's say to (70,):
>>> a = numpy.array([0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
>>> p = 1 << arange(a.shape[-1] - 1, -1, -1) #left shift
>>> p
array([ 1, 2, 4,
8, 16, 32,
64, 128, 256,
512, 1024, 2048,
4096, 8192, 16384,
32768, 65536, 131072,
262144, 524288, 1048576,
2097152, 4194304, 8388608,
16777216, 33554432, 67108864,
134217728, 268435456, 536870912,
1073741824, 2147483648, 4294967296,
8589934592, 17179869184, 34359738368,
68719476736, 137438953472, 274877906944,
549755813888, 1099511627776, 2199023255552,
4398046511104, 8796093022208, 17592186044416,
35184372088832, 70368744177664, 140737488355328,
281474976710656, 562949953421312, 1125899906842624,
2251799813685248, 4503599627370496, 9007199254740992,
18014398509481984, 36028797018963968, 72057594037927936,
144115188075855872, 288230376151711744, 576460752303423488,
1152921504606846976, 2305843009213693952, 4611686018427387904,
-9223372036854775808, 0, 0,
0, 0, 16])
在顶部,您可以看到随着它从1,2,4,8,....递增,变为负数,然后为0,然后最终为16.
At the top you can see that as it increases from 1,2,4,8,..... becomes negative and then 0 and then 16 eventually.
如果我单独进行操作,情况并非如此:
This is not the case if I do it separately :
>>> 1<<70
1180591620717411303424
那么,我该怎么做才能使数组元素具有与1<<x
相对应的值,其中x是一个大数(大于70)?
So, what can I do to make the elements of my array to have values corresponding to 1<<x
, where x is a high number (greater than 70)?
推荐答案
Python int和numpy int不相同... Python支持任意长度,而numpy由以下类型固定:
Python int and numpy int are not the same... Python supports arbitrary length, whereas numpy is fixed by the type:
numpy.array([1]) << 70
>>> array([64], dtype=int32)
一种解决方案是使用对象dtype:
One solution is to use the object dtype:
numpy.array([1], dtype=numpy.object) << 70
>>> array([1180591620717411303424], dtype=object)
以下将按预期工作:
a = numpy.array([1], dtype=numpy.object) << numpy.arange(70)
查看最后一个元素的类型,我们看到它是一个Python int:
Looking at the type of the last element, we see that it is a Python int:
type(a[-1])
>>> <class 'int'>
这篇关于在数组中执行按位左移运算时,越过了整数限制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!