2016-07-30 72 views
3

我有numpy的差異的奇怪行爲的情況下:numpy的差異怪異的行爲

a = list(img_arr[y_coord_1,:]) 
print a 
print np.diff(a) 

>>[62, 62, 62, 62, 62, 62, 62, 62, 63, 62, 96, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 66, 63, 64, 64, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 65, 65, 64, 63, 63, 63, 63, 63, 63, 63, 64, 64, 63, 63, 63, 63, 63, 64, 65, 65, 64, 63, 63, 63, 63] 
>>[ 0 0 0 0 0 0 0 1 255 34 2 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 224 253 1 0 255 
0 0 0 0 0 0 0 0 0 1 1 0 255 255 0 0 0 0 
0 0 1 0 255 0 0 0 0 1 1 0 255 255 0 0 0] 

現在,當我在終端運行此我得到

array([ 0, 0, 0, 0, 0, 0, 0, 1, -1, 34, 2, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -3, 1, 
    0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 
    0, -1, -1, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 
    0, 0, 0, 1, 1, 0, -1, -1, 0, 0, 0]) 

什麼樣的正確答案事情可能會導致此 - 我在這個腳本中使用其他一些編譯庫,如果這相關

編輯:我剛剛發現它的負數是錯誤的 - 而上限是非常可疑欠條。看起來像一個dtype問題。

+4

什麼是'a.dtype'?它是否是'np.uint8'? –

+1

這是正確的問題。這是一個溢出錯誤 - 因爲之前沒有發現它而感到很愚蠢。我認爲list命令會轉換回python浮點數或其他東西 – user3684792

+1

在'np.uint8'數組上調用'list()'會給你一個'np.uint8'標量值列表。您需要顯式地將您的數組轉換爲有符號整數類型。 –

回答

2

.tolist()是將數組轉換爲列表(或嵌套列表)的更好方法。它一直貫穿整個轉換過程。 list()只是在一個層次上迭代。由於數組已經可迭代,所以我認爲list(anarray)沒有任何用處。

開始使用數組:

In [789]: z 
Out[789]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8) 
In [790]: type(list(z)[0]) 
Out[790]: numpy.uint8 

list()是一樣的這個list解析:

In [791]: type([i for i in z][0]) 
Out[791]: numpy.uint8 

轉換

In [792]: type(z.tolist()[0]) 
Out[792]: int 

爲什麼您在使用list()正確的列表第一名?你不需要它diff。如果溢出是一個問題,則dtype轉換更好。

np.diff將在返回差異之前將列表重新轉換爲數組。

In [793]: np.diff(z.tolist()) 
Out[793]: array([1, 1, 1, 1, 1, 1, 1, 1, 1]) 
In [794]: np.diff(list(z)) 
Out[794]: array([1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=uint8) 
In [795]: np.diff(z.astype('int')) 
Out[795]: array([1, 1, 1, 1, 1, 1, 1, 1, 1]) 
In [796]: np.diff(z) 
Out[796]: array([1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=uint8) 
In [797]: np.array(list(z)) 
Out[797]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8)