tim*_*ado 47 python scalar numpy append overflow
我是编程新手.在我最新的Python 2.7项目中,我遇到了以下内容:
RuntimeWarning:在long_scalars中遇到溢出
有人可以详细说明这意味着什么以及我能做些什么来解决这个问题?
代码贯穿始终,但我不确定忽略警告是否是个好主意.
它发生在追加过程中,如:
SomeList.append(VeryLongFormula)
Run Code Online (Sandbox Code Playgroud)
unu*_*tbu 50
这是一个发出相同警告的示例:
import numpy as np
np.seterr(all='warn')
A = np.array([10])
a=A[-1]
a**a
Run Code Online (Sandbox Code Playgroud)
产量
RuntimeWarning: overflow encountered in long_scalars
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,它发生因为a是dtype int32,并且a中可存储的最大值int32是2**31-1.因为10**10 > 2**32-1,取幂导致的数量大于可以存储的数量int32.
请注意,您不能依赖于np.seterr(all='warn')捕获numpy中的所有溢出错误.例如,在32位NumPy上
>>> np.multiply.reduce(np.arange(21)+1)
-1195114496
Run Code Online (Sandbox Code Playgroud)
而在64位NumPy上:
>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848
Run Code Online (Sandbox Code Playgroud)
两者都没有任何警告而失败,尽管它也是由于溢出错误造成的.正确答案是21!等于
In [47]: import math
In [48]: math.factorial(21)
Out[50]: 51090942171709440000L
Run Code Online (Sandbox Code Playgroud)
与真正的浮点错误(硬件FPU在进行溢出的原子操作时设置标志)不同,我们需要自己实现整数溢出检测.我们在标量上做,但不是数组,因为对于数组上的每个原子操作来说实现起来太慢了.
因此,您需要选择合适的负担,dtypes以免任何操作溢出.
小智 8
解决此问题的一种简单方法是使用64位类型
list = numpy.array(list, dtype=numpy.float64)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
127132 次 |
| 最近记录: |