2011-09-26 11 views
28

Soy nuevo en la programación. En mi último proyecto de Python 2.7 me encontré con lo siguiente:Python RuntimeAdvertencia: se encontró desbordamiento en los escalares largos

RuntimeWarning: desbordamiento encontró en long_scalars

Podría alguien por favor explique lo que esto significa y lo que podría hacer para arreglar esto?

El código se ejecuta, pero no estoy seguro si es una buena idea simplemente ignorar la advertencia.

Sucede durante un proceso de agregación como:

SomeList.append(VeryLongFormula) 
+3

¿Podría mostrar una [ejemplo de corta, completa] (http://sscce.org/) que demuestra este problema ? –

+2

Incluyó la etiqueta numpy. Nada en sus preguntas sugiere numpy. No ha incluido el código que nos permite reproducir el error. Por favor, hazlo. –

+0

posible duplicado de http://stackoverflow.com/questions/3767409/python-warning-possibly-numpy – rocksportrocker

Respuesta

33

He aquí 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 v Alue Storable en un 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 32 bits NumPy

>>> np.multiply.reduce(np.arange(21)+1) 
-1195114496 

mientras que en 64 bits NumPy:

>>> 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! es igual a

In [47]: import math 

In [48]: math.factorial(21) 
Out[50]: 51090942171709440000L 

According to numpy developer, Robert Kern,

A diferencia de los errores de coma flotante verdaderos (donde el FPU de hardware establece un indicador cuando llega a registrarse una operación atómica que se desborda), tenemos que poner en práctica la detección de desbordamiento de entero Nosotros mismos. Lo hacemos en los escalares , pero no en las matrices porque sería demasiado lento implementar para cada operación atómica en las matrices.

Así que la carga está en que elija dtypes apropiado para que no se desborde la operación.

+2

¡Gracias! ¿Cómo puedo definir qué tipo de dty quiero? – timkado

+3

Puede establecer el 'dtype' al crear la matriz numpy. Por ejemplo, en mi ejemplo anterior, puede evitar el error de desbordamiento estableciendo: 'A = np.array ([10], dtype = 'int64')' – unutbu

+2

Aquí hay una [lista de tipos básicos] (http: // docs.scipy.org/doc/numpy/user/basics.types.html#data-types). – unutbu

0

Una manera fácil de superar este problema es utilizar 64 bits Tipo de

list = numpy.array(list, dtype=numpy.float64) 
Cuestiones relacionadas