在数组中执行按位左移运算时,越过了整数限制 [英] Integer limit crossed while performing bitwise left shift operation in array

查看:139
本文介绍了在数组中执行按位左移运算时,越过了整数限制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用按位左移运算符创建一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆