una - Python RuntimeWarning: desbordamiento encontrado en escalares largos
transpuesta de una matriz en python numpy (2)
Aquí hay un ejemplo que emite la misma advertencia:
import numpy as np
np.seterr(all=''warn'')
A = np.array([10])
a=A[-1]
a**a
rendimientos
RuntimeWarning: overflow encountered in long_scalars
En el ejemplo anterior sucede porque a
es de tipo int32
, y el valor máximo almacenable en int32
es 2 ** 31-1. Desde 10**10 > 2**32-1
, la exponenciación da como resultado un número que es más grande que el que se puede almacenar en un int32
.
Tenga en cuenta que no puede confiar en np.seterr(all=''warn'')
para detectar todos los errores de desbordamiento en numpy. Por ejemplo, en NumPy de 32 bits
>>> np.multiply.reduce(np.arange(21)+1)
-1195114496
mientras está en NumPy de 64 bits:
>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848
Ambos fallan sin ninguna advertencia, aunque también se debe a un error de desbordamiento. ¡La respuesta correcta es 21! igual
In [47]: import math
In [48]: math.factorial(21)
Out[50]: 51090942171709440000L
De acuerdo con el desarrollador numpy, Robert Kern ,
A diferencia de los verdaderos errores de coma flotante (donde el FPU de hardware establece un indicador cada vez que realiza una operación atómica que se desborda), necesitamos implementar la detección de desbordamiento de enteros nosotros mismos. Lo hacemos en los escalares, pero no en las matrices porque sería demasiado lento implementarlo para cada operación atómica en las matrices.
Por lo tanto, le corresponde a usted elegir los dtypes
adecuados para que ninguna operación se desborde.
Soy nuevo en la programación. En mi último proyecto de Python 2.7 encontré lo siguiente:
RuntimeWarning: overflow encontrado en long_scalars
¿Podría alguien explicar por favor qué significa esto y qué podría hacer para solucionarlo?
El código se ejecuta, pero no estoy seguro si es una buena idea ignorar la advertencia.
Sucede durante un proceso de adición como:
SomeList.append(VeryLongFormula)
Una manera fácil de superar este problema es usar el tipo de 64 bits
list = numpy.array(list, dtype=numpy.float64)