Spalte als Zeile ausgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cwesche
User
Beiträge: 14
Registriert: Mittwoch 10. Februar 2010, 11:43

Hallo Forum,

ich habe eine Datei mir 3 Spalten und 6976 Zeilen. Ich möchte gern z.B. die nur erste Spalte in ein neues Format pressen, welches die Form Spalten = 10 (oder 100) und entsprechend viele Zeilen hat. Ergo, ich möchte jeweils 10 Werte nebeneinander schreiben und das solange, bis alle 6976 Zeilen der Eingabedatei aufgebraucht sind.

Dafür habe ich den Befehl numpy.transpose() gefunden, welcher mir hoffentlich die Spalte als Zeile ausgibt.

Code: Alles auswählen

import numpy

file = 'data_for_readout.txt'
data = loadtxt(file, delimiter='	')

#Hier gehen ich noch scheibchenweise die Datei durch und betrachte erstmal nur die ersten 100 Zeilen der ersten Spalte
section1 = data[0:100,0] 

#Hier möchte ich die Spalte mit den ersten 100 Einträgen in eine Zeile mit 100 Spalten umwandeln
line = numpy.transpose(section1)

#Hier möchte ich die Zeile mit den 100 Spalten in eine Datei wegschreiben, die Spalten sollen dabei durch ein Komma getrennt werden
numpy.savetxt('data_for_readin.txt', line, delimiter=',')
Wenn ich mir nun die Ausgabedatei anschaue, ist sie trotzdem einspaltig mit 100 Zeilen.
Wo ist mein Denk- oder Programmierfehler?

Für hilfe jeglicher Art bin ich dankbar.

Grüße
BlackJack

@cwesche: Na schau Dir doch einfach mal die Zwischenergebnisse und deren `shape` an.
cwesche
User
Beiträge: 14
Registriert: Mittwoch 10. Februar 2010, 11:43

hab ich gemacht:

Code: Alles auswählen

dt = shape(line)
print dt
Ergebnis: (100L,)

Also alles ok, oder?
BlackJack

@cwesche: Das kommt drauf an was Du als ok ansiehst. Das ist ein eindimensionales Array, und das wird, wie dokumentiert, mit einem Wert pro Zeile gespeichert. Da Du das offenbar nicht willst, ist das vielleicht auch nicht ok. ;-)
cwesche
User
Beiträge: 14
Registriert: Mittwoch 10. Februar 2010, 11:43

offensichtlich klappt das ja nicht, also isses nicht ok. hast schon recht.

geht es, wenn ich nun einen array vordefiniere:

Code: Alles auswählen

a = scipy.zeros((70,100), dtype=float)    #Zeilen, Spalten
und dann die werte aus meiner ersten spalte der eingangsdaten in diese form presse?
BlackJack

@cwesche: Das könnte gehen, die Frage ist ob es der beste Weg ist, bzw. was eigentlich mit den Daten passieren soll. Wenn man mit schon mit Numpy-Arrays arbeitet, möchte man ja eigentlich möglichst viel mit Array-Operationen erledigen und möglichst wenig mit Python-Code oder gar Python-Schleifen.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

`transpose` funktioniert bei eindimensionalen Arrays nicht so wie Du denkst.

Code: Alles auswählen

line = numpy.reshape(section1, (-1,1))
cwesche
User
Beiträge: 14
Registriert: Mittwoch 10. Februar 2010, 11:43

@sirius3: danke für den hinweis.

Code: Alles auswählen

line = numpy.reshape(section1, (-1,1))
ließ zwar den array richtig erscheinen (100L,1L), wenn ich dann aber line in eine datei wegschreiben wollte:

Code: Alles auswählen

numpy.savetxt('data_for_readin.txt', line, delimiter=',')
war das ergebnis immernoch eine tabelle mit einer spalte und 100 zeilen.

@BlackJack: grund für diese frage ist ganz einfach die lesbarkeit in einem fortran skript. hier muss ich alle 6975 werte kommagetrennt hintereinanderschreiben und in der regel mache ich immer blöcke von 10 oder 100 werten nebeneinander und übergebe dann mit & an die nächste zeile. das erleichert mir die potentielle fehlersuche, wenn das skript nicht durchläuft. ist also nur ne vorbereitung, ich wollte dann den inhalt der rausgeschriebenen datei ins fortran skript kopieren.
die datei sollte dann quasi so aussehen:
  • 5,5,5,5,5,5,5,5,5,5,&
    5,5,5,5,5,5,5,5,5,5,&
    5,5,5,5,5,5,5,5,5,5,&
    .....

nun, ich habe mich jetzt erst einmal entschieden, dass ich dann halt alle knapp 7000 werte kommagetrennt hintereinander schreibe und hoffe, dass ich an den stellen keinen fehler suchen muss (was naiv von mir ist). mit:

Code: Alles auswählen

line = transpose(data)
numpy.savetxt('b:/IB_DETECTION/data_for_readin.txt', line, fmt='%.2f',delimiter=',')
habe ich alle drei spalten in drei zeilen umgewandelt und dann per hand ins fortran skript kopiert.

so würde es gehen, aber falls jemand noch ne idee hat, immer her damit. ansonsten bedanke ich mich schon mal für die hinweise.
BlackJack

@cwesche: Ein Shape von (100L,1L) bedeutet 100 Zeilen mit je einem Wert. (1, 100) dagegen bedeutet eine Zeile mit 100 Werten. Mal als Beispiel:

Code: Alles auswählen

In [23]: np.zeros((10, 1))
Out[23]: 
array([[ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.]])

In [24]: np.zeros((1, 10))
Out[24]: array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
Antworten