2017-05-31 3 views
0

Also hier ist der Deal: Ich habe Variable x, die eine numpy.ndarray ist. Die Größe dieser Struktur ist 1000. Wenn ich x[0] mache, dann bekomme ich eine numpy.void, von 4 Nummern. Wenn ich x[1] mache, dann bekomme ich noch eine numpy.void, auch von 4 Nummern, etc.Wie schneidet man ein numpy.darray aus numpy.void Zahlen?

Was ich einfach machen möchte: Ich möchte diese Datenstruktur aufteilen, damit ich eine numpige Matrix der Größe 1000x3 extrahiere.

Wie mache ich das? Dank

Antwort

2

Klingt wie Sie eine strukturierte Anordnung, so etwas wie dieses einfache Beispiel haben:

In [158]: x = np.ones((5,), dtype='i,i,f,f') 
In [159]: x 
Out[159]: 
array([(1, 1, 1., 1.), (1, 1, 1., 1.), (1, 1, 1., 1.), 
     (1, 1, 1., 1.), (1, 1, 1., 1.)], 
     dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', '<f4')]) 
In [160]: x[0] 
Out[160]: (1, 1, 1., 1.) 
In [161]: type(x[0]) 
Out[161]: numpy.void 

x[0] ist ein Rekord, als Tupel angezeigt. Der Zugriff auf Felder nach Namen (nicht durch ‚Spalte‘ index):

In [162]: x['f0'] 
Out[162]: array([1, 1, 1, 1, 1], dtype=int32) 
In [163]: x['f2'] = np.arange(5) 

In [165]: x['f1'] = [10,12,8,0,3] 
In [166]: x 
Out[166]: 
array([(1, 10, 0., 1.), (1, 12, 1., 1.), (1, 8, 2., 1.), 
     (1, 0, 3., 1.), (1, 3, 4., 1.)], 
     dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', '<f4')]) 
In [168]: x[['f2','f3']] # 2 fields at once 
Out[168]: 
array([(0., 1.), (1., 1.), (2., 1.), (3., 1.), (4., 1.)], 
     dtype=[('f2', '<f4'), ('f3', '<f4')]) 

Dies ist praktisch, wenn ‚Spalten‘ verschiedene Dinge enthalten sollen, zum Beispiel Strings in einem, ganze Zahlen in einem anderen. Es kann jedoch schwierig sein, ein solches Array in ein 2D-Array desselben numerischen Typs umzuwandeln.

view und astype Arbeit in begrenzten Fällen, aber tolist ist das robusteste Konversionsmedium, das mir bekannt ist.

In [179]: x.tolist() 
Out[179]: 
[(1, 10, 0.0, 1.0), 
(1, 12, 1.0, 1.0), 
(1, 8, 2.0, 1.0), 
(1, 0, 3.0, 1.0), 
(1, 3, 4.0, 1.0)] 
In [180]: np.array(x.tolist()) 
Out[180]: 
array([[ 1., 10., 0., 1.], 
     [ 1., 12., 1., 1.], 
     [ 1., 8., 2., 1.], 
     [ 1., 0., 3., 1.], 
     [ 1., 3., 4., 1.]]) 

beachte, dass die tolist für die strukturierte Anordnung eine Liste von Tupeln ist, während tolist für einen 2D-Array ist eine Liste von Listen. In dieser Richtung spielt dieser Unterschied keine Rolle. Anders herum ist der Unterschied wichtig.

Wie haben Sie dieses Array generiert? Von einer csv mit genfromtxt? Wie von einem anderen numerischen Paket ausgegeben?

+0

Jesus Christus. Genau das habe ich gebraucht. Ich danke dir sehr!! Ich habe es nicht erzeugt, ich wurde es übergeben. :) Ich glaube nicht, dass ich es jemals so zusammenfalten würde, wenn ich die Macht hätte, es zu generieren. – Spacey

Verwandte Themen