这是发出相同警告的示例:
import numpy as np
np.seterr(all='warn')
A = np.array([10])
a=A[-1]
a**a
产量
RuntimeWarning: overflow encountered in long_scalars
在上面的示例中,它的发生是因为的类型a
是dtype int32
,并且在an中可存储的最大值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
在64位NumPy上:
>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848
两者都失败,没有任何警告,尽管这也是由于溢出错误引起的。正确的答案是21!等于
In [47]: import math
In [48]: math.factorial(21)
Out[50]: 51090942171709440000L
与真正的浮点错误(硬件FPU在执行溢出的原子操作时会设置标志)不同,我们需要自己实现整数溢出检测。我们在标量上执行此操作,但不在数组上执行,因为对于数组上的每个原子操作而言,实现它都太慢了。
因此,选择合适的负担是您的重担,dtypes
这样就不会出现任何操作溢出的情况。