2012-09-26 33 views
4

我計算蟒2個numpy.uint8 S之間的絕對差值與 d = abs(a - b),這會導致溢出錯誤如果ba更大。避免這種情況的最好方法是什麼?更好的方法來計算numpy的無符號整數之間的差異在Python

+1

呃......不,它沒有。 Python會在必要時自動將整數提升爲long。另外,Python中沒有無符號整數類型。請發佈代碼來演示您實際遇到的問題以及回溯。 – kindall

+0

我從外部庫(pygtk)獲得a和b,其類型爲numpy.uint8。錯誤是RuntimeWarning:在ubyte_scalars中遇到溢出。因此,不可能舉一個簡短的工作示例。 – blues

回答

3

如您的評論所示,他們不是int s;他們是numpy.uint8 s。只需將它們轉換爲int S:

>>> a, b = map(numpy.uint8, (50, 60)) 
>>> a - b 
__main__:1: RuntimeWarning: overflow encountered in ubyte_scalars 
246 
>>> a, b = map(int, (a, b)) 
>>> a - b 
-10 

既然你擔心速度,這裏有幾個測試(借用Sven的形式,感謝):

>>> %timeit abs(int(a) - int(b)) 
1000000 loops, best of 3: 410 ns per loop 
>>> %timeit a - b if a > b else b - a 
1000000 loops, best of 3: 470 ns per loop 

所以,是的,它的速度更快,但除非我們談論數百萬次,否則無所謂。

+0

這比Ionut建議的測試速度快嗎?因爲我需要經常這樣做。 – blues

+0

@blues,如果你有一個numpy數組(它看起來很像鴨子打字的列表),你可能會*更快*,但如果它的單值numpy無法幫助你的速度...... – seberg

2

最簡單的方法是你的號碼手動轉換到Python整數第一:

d = abs(int(a) - int(b)) 

Python的整數不能溢出(除非內存已滿)。

0

對我來說,它不會拋出溢出錯誤,只是如果b大於a,會導致錯誤值。留在uint8界限使用此功能:

def abs_dev (a, b) : 
    sub1 = a - b 
    sub2 = b - a 
    mask = a < b 
    sub1[mask] = sub2[mask] 
    return sub1 
相關問題