2011-09-26 281 views
28

我是編程新手。在我最新的Python 2.7的項目,我遇到了以下:Python RuntimeWarning:在長標量中遇到的溢出

RuntimeWarning:在long_scalars

遇到可能有人請詳細說明這是什麼意思,我可以做些什麼來解決這個問題是什麼溢出?

該代碼貫穿始終,但我不確定是否忽略該警告是一個好主意。

這期間追加的過程發生,如:

SomeList.append(VeryLongFormula) 
+3

請您展現出[短,完整的示例](http://sscce.org/)演示這個問題? –

+2

你包含numpy標籤。你的問題中沒有任何東西可以表明它是不平坦您沒有包含允許我們重現錯誤的代碼。請這樣做。 –

+0

http://stackoverflow.com/questions/3767409/python-warning-possibly-numpy可能的副本 – rocksportrocker

回答

33

下面是其發出同樣的警告的例子:

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,而maximim v可存儲在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 

According to numpy developer, Robert Kern

不像真正的浮點錯誤(在硬件FPU設置一個 標誌 只要它是溢出的原子操作),我們需要 實現整數溢出檢測我們自己。我們在 標量上執行它,但不是數組,因爲它對於在陣列上執行每個原子操作的 執行 太慢。

所以你的負擔是選擇適當的dtypes,以免操作溢出。

+2

謝謝!我如何定義我想要的dtype? – timkado

+3

您可以在創建numpy數組時設置'dtype'。例如,在我上面的示例中,可以通過設置來避免溢出錯誤:'A = np.array([10],dtype ='int64')' – unutbu

+2

這裏是一個[基本dtypes列表](http:// docs.scipy.org/doc/numpy/user/basics.types.html#data-types)。 – unutbu

0

一個簡單的方法來解決這個問題是使用64位類型

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