2016-04-09 69 views
1

enthält Also ich versuche, in einigen Daten zu lesen, die wie folgt aussehen (das ist nur die erste Zeile):np.genfromtxt Verwendung in Daten zu lesen, die Arrays

1 14.4132966509 (-1.2936631396696465, 0.0077236319580324952, 0.066687939649724415) (-13.170491147387787, 0.0051387952329040587, 0.0527163312916894) 

Ich bin versucht, es zu lesen mit np.genfromtxt mit:

skirt_data = np.genfromtxt('skirt_data.dat', names = ['halo', 'IRX', 'beta', 'intercept'], delimiter = ' ', dtype = None) 

Aber es Rückkehr dieses:

ValueError: size of tuple must match number of fields. 

Meine Frage ist, wie genau lade ich in die Arrays, die innerhalb der Daten sind, so dass ich die erste Zahl in diesem Array herausziehen kann? Letztlich will ich, so etwas zu tun mit dem ersten Wert der Beta-Spalte suchen:

skirt_data['beta'][1] 

Dank der Zeit voraus!

+1

Ihre Daten sind kein quadratischer Tisch, mit ziemlich viel Struktur . Ich denke, du solltest deinen eigenen Import schreiben. Benutze einfache Python 'readlines' und zerlege jede Zeile nach der Struktur, die du verstehst. Man könnte mit mehreren Separatoren spielen und trotzdem "numpy" Importeure verwenden, aber es wäre nicht sehr elegant. – roadrunner66

+0

Das '()' wird 'genfromtxt' Probleme geben. Es ist für Zeilen mit nur Feldern und Trennzeichen ohne Anführungszeichen oder andere Klammern konzipiert. Aber es akzeptiert die Eingabe von Ihrem eigenen Zeilenleser (alles, was es Zeilen speist). So können Sie das '()' herausfiltern, indem Sie sie durch reguläre Trennzeichen ersetzen. – hpaulj

Antwort

1

Wenn jede Zeile die gleiche ist, würde ich mit einem benutzerdefinierten Parser gehen.

können Sie teilen die Linie mit str.split (sep, optional max Splits)

So etwas entlang der Linien von

names = [list from above] 
output = {} 
with open('skirt_data.dat') as sfd: 
    for i, line in enumerate(sfd.readlines()): 
     skirt_name = names[i] 
     first_col, second_col, rest = line.split(' ', 2) 
     output[skirt_name] = int(first_col) 
print output 
+0

Wow! Ich habe nicht einmal daran gedacht, einen benutzerdefinierten Parser zu schreiben. Danke für den Tipp (offensichtlich bin ich neu in Python). Also habe ich Ihren Vorschlag so bearbeitet, dass er so aussieht: 'mit open ('rock_data.dat') als sfd: für i, Zeile in enumerate (sfd.readlines()): \t rock_name = names [i] \t first_col, second_col, third_col, fourth_col = line.split (‘‚) \t Ausgang [skirt_name] = int (third_col [1]) Druck output' Aber jetzt mir diesen Fehler es gibt: 'Valueerror: zu viele Werte zu Entpacken Sie in Zeile 4. Gibt es eine Möglichkeit, iteritems() hier zu verwenden? – Dyell

+0

Entschuldigung, ich habe den Kommentar nicht gesehen. Das Problem ist, dass es mehr als 4 Spalten in einer Reihe gibt, und Python weiß nicht, wie man> 4 Werte in 4 Variablen schreibt. Ich würde Iteritems nicht verwenden, weil das für Wörterbücher ist, und das ist eine Liste. Sie können die Spuckergebnisse in eine Liste speichern: 'cols = line.split ('')' und dann die Länge überprüfen und nur dann speichern, wenn es gut ist: 'if len (cols)> 4: first_col = col [0]. .. 'oder setze das' max_split'-Argument, um (den 2. arg) in '4' aufzuteilen, und ändere die Zeile in' first_col, second_col, drittes_col, viertes_col, rest = line.split ('', 4) 'extra Spalten gehen zu "Ruhe" –