2016-04-25 11 views
1

Meine CSV hat eine Mischung aus Strings und numerischen Spalten. nump.recfromcsv gefolgert sie genau (Woo-Hoo) numpy reparray von CSV dtype hat viele Spalten aber Form sagt nur eine Zeile, warum ist das?

dtype = [('null', 'S7') eine dtype von

geben, ('00', '< f8'), ('nsubj', ‚S20 '), (' g ',' S1 '), ...

Also eine Mischung aus Strings und Zahlen, wie Sie sehen können. Aber numpy.shape(csv) gibt mir

(133433,)

Was mich verwirrt, da dtype implizierte es war Spalte bewusst. Außerdem greift es intuitiv:

csv[1] 
> ('def', 0.0, 'prep_to', 'g', 'query_w', 'indef', 0.0, ... 

Ich habe auch den Fehler

kann nicht mit flexiblerem Typ

auf Operationen wie .all(), selbst durchführen reduzieren, wenn sie mit einer numerischen Spalte . Ich bin mir nicht sicher, ob ich wirklich mit einer tabellenartigen Entität (zwei Dimensionen) oder nur mit einer Liste von etwas arbeite. Warum stimmt der dtype nicht mit der Form überein?

+0

Werfen Sie einen Blick auf meine aktuelle Antwort zu 'genfromtxt' und' dtype', http://stackoverflow.com/a/36814096/901925. Ich bin nicht so vertraut mit 'recfromcsv', aber ich erwarte, dass die Arrays ähnlich sind, ein 1d-Array mit einem zusammengesetzten' dtype'. Sie greifen auf Zeilen (Datensätze) nach Nummer, Felder (Spalten) nach Namen zu. Für ein 'recarray' sollte' csr.null' Ihnen ein Array der ersten Spalte, die 'S7'-Namen, geben. – hpaulj

Antwort

2

Ein Recarray ist ein Array von Datensätzen. Jeder Datensatz kann mehrere Felder enthalten. Ein Datensatz ist eine Art Struktur wie in C.

Wenn die Form des Neuarrays (133433,) ist, dann ist das Neuarray ein 1-dimensionales Array von Datensätzen.

Die Felder des Neuarrays können durch name-basierte Indizierung zugegriffen werden. Zum Beispiel csv['nsub'] und ist im Wesentlichen äquivalent zu

np.array([record['nsub'] for record in csv]) 

Diese speziellen namensbasierten Indizierung der Illusion unterstützt, dass ein 1-dimensionales recarray ein 2-dimensionale Array - csv[intval] wählen Zeilen csv[fieldname] wählt „Spalt“. Aber unter der Haube und streng sprechen, wenn die Form (133433,) dann ist es 1-dimensional.

Beachten Sie, dass nicht alle Wiederholungen 1-dimensional sind. Es ist möglich, einen höherdimensionalen recarray zu haben,

In [142]: arr = np.zeros((3,2), dtype=[('foo', 'int'), ('bar', 'float')]) 

In [143]: arr 
Out[143]: 
array([[(0, 0.0), (0, 0.0)], 
     [(0, 0.0), (0, 0.0)], 
     [(0, 0.0), (0, 0.0)]], 
     dtype=[('foo', '<i8'), ('bar', '<f8')]) 

In [144]: arr.shape 
Out[144]: (3, 2) 

Dies ist ein 2-dimensionales Array, dessen Elemente Datensätze.

Hier sind die bar Feldwerte in der arr[:, 0] slice:

In [148]: arr[:, 0]['bar'] 
Out[148]: array([ 0., 0., 0.]) 

Hier sind alle bar Feldwerte in dem 2D-Array:

In [151]: arr['bar'] 
Out[151]: 
array([[ 0., 0.], 
     [ 0., 0.], 
     [ 0., 0.]]) 

In [160]: arr['bar'].all() 
Out[160]: False 

beachten, dass eine Alternative zur Verwendung von recarrays ist Pandas Dataframes . Es gibt viel mehr Methoden zum Manipulieren von Datenrahmen als von Neuanordnungen. Vielleicht finden Sie es bequemer.

+0

der dtype schien alle Typinformationen für jede Spalte zu speichern - ohne dass ein Array von Datensätzen als multidimensional behandelt wurde? – djechlin

+0

Offenbar, ja. Das habe ich gerade auch aus der Antwort von unutbu gelernt. Aber die Antwort und Ihre Beobachtung sind konsistent. Der Typ kapselt die 2. Dimension ein. Ihr Beispiel verhält sich also eher wie eine Liste von Listen und weniger wie ein 2D-Array. – roadrunner66

+1

Mit einem 'dtype' können verschiedene Felder unterschiedliche 'dtype' und Größen haben. In einem "n-d" -Array hat jedes Element den gleichen "dtype" und "nbytes". Eine zusammengesetzte "dtype" fügt eine neue Art von Dimensionalität innerhalb des "n-d" -Arrays hinzu. Es gibt eine Überschneidung von Konzepten, aber auch eine fundamentale Diskontinuität. – hpaulj

Verwandte Themen