2012-02-04 3 views
11

У меня есть следующий код:ошибка Numpy: недопустимое значение встречается у власти

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: invalid value encountered in power b = numpy.arange(n) ** 3

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

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 

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

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

+0

: код работает fine.Maybe вы сделало STH еще, что вызывает ошибку? – George

+1

Будет ли она работать с 'size = 1000' в вашей системе? Тогда это проблема с типом данных - рассмотрите установку параметра 'dtype' в' arange() '. – krlmlr

ответ

16

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]) 

где вещи улучшить, как количество битов увеличивается. Если вы действительно хотите Numpy операции массива на Python целых чисел произвольного размера, Вы можете установить DTYPE объект:

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

Спасибо. Действительно, это python 32 бит. – lmsasu

Смежные вопросы