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: 在计算幂时遇到无效值 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
我猜这是因为我试图把一个很大的数字的三次方。除了使用浮点数,我还能做些什么呢?
我正在使用Python 3.2。
1 个回答
19
numpy在这方面其实是帮了你。跟标准的Python不同,它的整数运算不支持任意精度的对象。我猜你可能在用32位的Python,因为我那边做同样的操作不会出现溢出:
>>> 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中对任意大小的整数使用numpy数组操作,可以把dtype设置为对象:
>>> numpy.arange(10, dtype=object)**20
array([0, 1, 1048576, 3486784401, 1099511627776, 95367431640625,
3656158440062976, 79792266297612001, 1152921504606846976,
12157665459056928801], dtype=object)