2017-06-09 1 views
1

Während ich das Spiel mit numpy,die dtype von numpy Array Wechsel wirkt sich auf die Daten

x = np.arange(9).reshape((3,3)) 
x 

es array([[0, 1, 2],[3, 4, 5],[6, 7, 8]])

kehrt aber sobald ich den Datentyp ändern

von
x.dtype=np.int8 
x 

jetzt x wird array([[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,0, 0],[3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0,0, 0],[6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0,0, 0]], dtype=int8) und x.shape gibt zurück.

Warum passiert das?

Vielen Dank im Voraus!

+0

Ich weiß nicht, warum das passiert ist, aber Sie wollen wahrscheinlich 'x.astype (np.int8)' – Akavall

Antwort

5

Wenn Sie die dtype so ändern, wie Sie es tun, ändern Sie nicht die Daten, sondern die Interpretation davon. Das bedeutet, dass Sie für jedes int64 (Ihren Standard-Int-Typ) 8 int8-Werte erhalten. Und mit der LSB-Reihenfolge von Bytes im Speicher sind die niedrigsten 8 Bits (d. H. Das niedrigste Byte) die ersten, die Ihnen Ihre Nummer geben (solange sie kleiner als 256 ist), gefolgt von 7 Nullen.

Was Sie wahrscheinlich tun möchten, ist, die Daten zu konvertieren und ein neues Speicherlayout zu generieren, ein neues Array aus dem alten zu generieren, dies kann z.B. von:

x=np.array(x, dtype=np.int8) 

oder einfacher:

x.astype(np.int8) 
+0

So 'dtype' geändert werden kann direkt wie' shape' . Aber ich habe es nie zuvor gesehen; Ich bin mir nicht sicher, ob es in den Dokumenten sogar sanktioniert ist. – hpaulj

+0

@hpaulj Ja, wahrscheinlich möchten Sie es nicht tun, da das Ergebnis wahrscheinlich nicht sehr portabel ist. Es hat mit der zugrundeliegenden Darstellung in c zu tun. Somit kann es abhängig von der Architektur LSB oder MSB sein und zumindest theoretisch von der Elementgröße und dem Auffüllen des darunterliegenden c-Arrays abhängen. – JohanL

0

dtype.gist link

Ich habe Ihren Code gespielt und festgestellt, dass, wenn Sie den Datentyp von numpy Array ändern dann nach dtype, dass die Array-Elemente sind Jetzt und was früher war beeinflussen die Anzahl der Elemente im Array. Lassen Sie diskutieren mehr
In meinem Fall früher dtype von numpy Array war int32 und ich änderte es in

dtype = np.int8 

so 32/8 = 4 sind jeweils Elemente nun durch 3 zusätzlich angehängte Null, und ich denke, in Ihrem Fall früher numpy Array dtype war

dtype = np.int64 

, warum jedes Element von 7 Nullen angehängt wird.

so jetzt Element des Arrays ist 8 Bit, aber im Speicher wurde 32 Bit (in meinem Fall) und 64 Bit in Ihrem Fall zugewiesen. Aus diesem Grund ist der Restspeicher jetzt null.

Noch eine Sache, Wenn Sie nun den Wert x [0,0] auf einen solchen Wert ändern, kann 8 Bit nicht mehr angezeigt werden, es zeigt etwas anderes als Ihren Wert an. Es geht also um die Speicherzuweisung.

Ich hoffe, dies wird Ihnen helfen,

Verwandte Themen