Целочисленный предел пересечен при выполнении побитового сдвига влево в массиве

Я создаю массив 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,):

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

Это не тот случай, если я делаю это отдельно:

>>> 1<<70
1180591620717411303424

Итак, что я могу сделать, чтобы элементы моего массива имели значения, соответствующие 1<<x, где x - большое число (больше 70)?

Python ints и numpy ints - это не одно и то же ...

Benjamin 12.09.2018 20:22

В частности, целые числа Python имеют переменную точность и являются очень тяжелыми объектами для ее поддержки. Numpy ints отражает целые числа фиксированной ширины.

Max 12.09.2018 20:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Python int и numpy int - это не одно и то же ... Python поддерживает произвольную длину, тогда как numpy фиксируется типом:

numpy.array([1]) << 70
>>> array([64], dtype=int32)

Одно из решений - использовать объект dtype:

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

Спасибо. Ваша работа потрясающая! Но, как вы упомянули, у объекта dtype большое снижение производительности. Можем ли мы что-то сделать, чтобы это улучшить? Я в основном делаю это, чтобы улучшить свою производительность!

appsdownload 12.09.2018 20:45

@appsdownload: вам следует задать отдельный вопрос об аспекте производительности ...

Benjamin 12.09.2018 21:13

Другие вопросы по теме