Вот пример, который выдает то же предупреждение:
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
, иМаксимальное значение, хранимое в 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
По словам разработчика numpy Роберта Керна ,
В отличие от истинных ошибок с плавающей запятой (когда аппаратный FPU устанавливает флаг всякий раз, когда он выполняетатомарная операция, которая переполняется), мы должны сами реализовать целочисленное определение переполненияМы делаем это в скалярах, но не в массивах, потому что это будет слишком медленно реализовывать для каждой элементарной операции над массивами.
Так что вы должны выбрать подходящий dtypes
, чтобы не выполнять никаких операцийпереполнение.