Ошибка NUMPY: неверное значение встречается в power - PullRequest
11 голосов
/ 04 февраля 2012

У меня есть следующий код:

import numpy

def numpysum(n):
   a = numpy.arange(n) ** 2
   b = numpy.arange(n) ** 3
   c = a + b
   return c


size = 3000
c = numpysum(size)

Во время работы я получаю сообщение об ошибке:

D: \ Work \ Programming \ python \ test_1 \ src \ test1_numpy.py: 6: RuntimeWarning: недопустимое значение в power b = numpy.arange (n) ** 3

Обратите внимание, что следующая функция без numpy работает нормально:

def pythonsum(n):
   a = list(range(n))
   b = list(range(n))
   c = []
   for i in range(len(a)):
      a[i] = i ** 2
      b[i] = i ** 3
      c.append(a[i] + b[i])
   return c

Iдумаю, это происходит потому, что я пытаюсь поднять большое число до степени три.Что я могу сделать, кроме работы с числами с плавающей запятой?

Я работаю с Python 3.2.

1 Ответ

17 голосов
/ 04 февраля 2012

numpy на самом деле присматривает за тобой на этом.Unlke в стандартном Python, его целочисленные операции не работают с объектами произвольной точности.Я предполагаю, что вы работали с 32-битным питоном, потому что те же самые операции для меня не переполняются:

>>> sys.maxsize
9223372036854775807
>>> size = 3000
>>> c = numpysum(size)
>>>

, но они будут в конечном итогеЕще проще увидеть, если вы контролируете размер типа вручную:

>>> numpy.arange(10, dtype=numpy.int8)**10
__main__:1: RuntimeWarning: invalid value encountered in power
array([  0,   1,   0, -87,   0,  -7,   0, -15,   0,   0], dtype=int8)
>>> numpy.arange(10, dtype=numpy.int16)**10
array([     0,      1,   1024,  -6487,      0,    761, -23552,  15089,
            0,      0], dtype=int16)
>>> numpy.arange(10, dtype=numpy.int32)**10
array([          0,           1,        1024,       59049,     1048576,
           9765625,    60466176,   282475249,  1073741824, -2147483648], dtype=int32)
>>> numpy.arange(10, dtype=numpy.int64)**10
array([         0,          1,       1024,      59049,    1048576,
          9765625,   60466176,  282475249, 1073741824, 3486784401])

, где все улучшается с увеличением количества бит.Если вам действительно нужны операции с массивами над числами Python произвольного размера, вы можете установить для dtype значение object:

>>> numpy.arange(10, dtype=object)**20
array([0, 1, 1048576, 3486784401, 1099511627776, 95367431640625,
       3656158440062976, 79792266297612001, 1152921504606846976,
       12157665459056928801], dtype=object)
...