2016-07-30 2 views
3

Ich habe einen Fall von seltsamem Verhalten von numpy diff:numpy diff seltsames Verhalten

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] 

Nun, wenn ich dies im Terminal laufen bekomme ich die richtige Antwort von

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]) 

Welche Art von Dinge können dies verursachen - ich benutze ein paar andere kompilierte Bibliotheken in diesem Skript, wenn dies der Relevanz

Edit: Ich habe gerade festgestellt, dass es die negativen Zahlen, die falsch sind - und die obere Grenze ist sehr suspekt ie. Sieht aus wie ein dtype Problem.

+4

Was ist 'a.dtype'? Ist es zufällig "np.uint8"? –

+1

Das ist das korrekte Problem. Es ist ein Überlauffehler - fühle dich albern, weil du es vorher nicht bemerkt hast. Ich nahm an, dass der Befehl list würde zurück in Python Floats oder etwas konvertieren – user3684792

+1

Calling 'list()' auf einem 'np.uint8' Array wird nur eine Liste von' np.uint8' Skalarwerte geben. Sie müssen Ihr Array explizit auf einen vorzeichenbehafteten Integer-Typ umwandeln. –

Antwort

2

.tolist() ist eine bessere Möglichkeit, ein Array in eine Liste (oder verschachtelte Listen) zu konvertieren. Es führt die Umwandlung vollständig nach unten. list() iteriert nur auf einer Ebene. Und da ein Array bereits iterierbar ist, glaube ich nicht, dass list(anarray) irgendetwas Nützliches tut.

Start mit einem Array:

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() ist die gleiche wie diese Liste Verständnis:

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

die richtige Liste Umwandlung

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

Warum Sie list() verwendet haben in der erster Platz? Sie haben es nicht für diff benötigt. Wenn Überlauf ein Problem ist, ist Dtype-Konvertierung besser.

np.diff wird eine Liste zurück in ein Array drehen, bevor die Unterschiede übernommen werden.

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)