猿问

在数组中执行按位左移操作时超出整数限制

我正在使用按位左移运算符创建一个 numpy 数组。


例如,我创建了数组 p,其中数组的形状与矩阵 a 的形状相同,即 (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,):


>>> 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,


在顶部,您可以看到,当它从 1,2,4,8 增加时,..... 变为负数,然后变为 0,最终变为 16。


如果我单独进行,则情况并非如此:


>>> 1<<70

1180591620717411303424

那么,我该怎么做才能使数组的元素具有对应于 的值1<<x,其中 x 是一个大数字(大于 70)?


HUWWW
浏览 171回答 1
1回答

肥皂起泡泡

Python int 和 numpy int 不一样... Python 支持任意长度,而 numpy 由类型固定:numpy.array([1]) << 70>>> array([64], dtype=int32)一种解决方案是使用对象数据类型:numpy.array([1], dtype=numpy.object) << 70>>> array([1180591620717411303424], dtype=object)以下将按预期工作:a = numpy.array([1], dtype=numpy.object) << numpy.arange(70)查看最后一个元素的类型,我们看到它是一个 Python int:type(a[-1])>>> <class 'int'>
随时随地看视频慕课网APP

相关分类

Python
我要回答