2017-07-19 3 views
0

So habe ich ein Array, das ist (10,3) mit Typ von i4. Ich möchte die Daten in 3 verschiedene String-Arrays konvertieren, aber ich habe Probleme mit der 2d-Version des Arrays.Probleme Umwandlung von D-Typ i4 zu D-Typ s4

import numpy 
xyz = (100.0*numpy.random.random((10,3))).astype("i4") 
A = xyz[:,0:3].view("S12") #works fine 
B = xyz[:,0:2].view("S8") #fails 
C = xyz[:,0:1].view("S4") #works fine 

D = xyz[0,0:2].view("S8") #works fine using only 1 element instead of whole array 

Warum ist es mir nicht möglich, auf die allgemeine Form zu konvertieren:

xyz[:,0:dim].view("S%d"%(4*dim)) 

unabhängig von der gewählten dim?

Antwort

1
xyz[:,:2].copy().view('S8') 

funktioniert.

Mit [:,:2] sehen Sie 2 Zahlen (4 Byte Blöcke), überspringen 1, die nächsten 2 usw. Das ist eine Ansicht, keine Kopie, weil Schritt und Form das verarbeiten können, ohne die zugrunde liegenden Daten zu ändern.

Aber wenn Sie versuchen, die gleiche Sache in 8 Bytes Blöcke zu sehen, können Schritte nicht damit umgehen. Es erfordert das Anzeigen von 1 Block, das Überspringen von 1/2-Block usw.

Durch Erstellen einer Kopie sind diese 8-Byte-Blöcke zusammenhängend und können als eine Einheit betrachtet werden.

numpy.array(xyz[:,0:2].tostring()) ist effektiv eine Kopie - Schreiben der Daten (nur die :2 Spalten) zu einem bytestring, und ein Array neu erstellen.

+0

Also funktionieren die [:,: 3] und [:,: 1], weil sie einen ganzen Block anzeigen oder 1 anzeigen und 2 überspringen? Keine seltsamen Halbblöcke beteiligt? – Eric

0

Also habe ich etwas Experimentieren getan, und es sieht aus wie ich habe etwas gefunden, das konsequent funktioniert:

numpy.array(xyz[:,0:2].tostring()).view("10S8").reshape(10,1) 

Im nicht super gepumpt es seit seinem so seltsam zu sein mit der Suche, aber es funktioniert so was auch immer Ich vermute. Wenn jemand eine bessere Antwort hat, lass es mich wissen.