Spalten statt Zeilen lesen und AUsgabeformat

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
vucub-caquix
User
Beiträge: 9
Registriert: Mittwoch 28. Oktober 2009, 10:33

Tatsächlich hat meine Testdatei nur 2 Spalten, das Programm soll aber wesentlich grössere Datenmengen "mischen" die nicht nur ints sind, dabei ist die Anzahl der Spalten nicht konstant.
Ich glaube die Methode das orginal Array zu transponieren ist ein gute Idee, ich kann so das Problem umgehen, dass ich nicht weiss wie viele Spalten es geben wird und über

Code: Alles auswählen

data_shuffled = [numpy.random.permutation(row) for row in data]
ein neues Array erzeugen, welches die randomisierten Daten enhält.
Das gleiche geht über

Code: Alles auswählen

for i in range(x):
        numpy.random.shuffle(data[i])
print data
Da müsste man eben "x" kennen, also die Anzahl der Spalten. Wenn ich das Ergebnis in eine file schreibe

Code: Alles auswählen

outfile = numpy.savetxt(infile + '_shuffled.dat', data_shuffled, fmt='%.2f')
kommt in beiden Fällen das Gleiche raus, das sieht dann z.B so aus:
1.50 4.50 2.50 9.50 3.50 6.50 8.50 0.50 7.50 5.50
14.50 12.50 15.50 16.50 10.50 11.50 17.50 13.50 19.50 18.50
Was in meiner Ursprungsdatei also Spalten waren sind nun Zeilen, das ist für die weitere Bearbeitung ungünstig.
Ich finde leider keine Ausgabeoption für numpy.savetxt, die es mir erlaubt transponiert in die Datei zu schreiben (also sowas wie unpack für das lesen). Ich kann auch nicht .transpose() drauf anwenden, python beschwert sich dann, dass mein Objekt eine Liste ist, auf die ich transpose nicht anwenden kann:
data_shuffled.transpose()
AttributeError: 'list' object has no attribute 'transpose'
Das liegt soweit ich das verstehe daran, dass ich im Beispiel mit 2 Spalten, 2 arrays erzeuge, die also eigentlich 2 Listen sind und daher nicht transponierbar.
Das ist wiederum kein Problem, wenn ich nicht unpack nehme und die Schleife oben mir numpy.random.shuffle ausführe.

Es gibt also 2 Möglichkeiten das Problem zu lösen:
1. Die Spalten der Ausgangsdatei zu zählen, damit ich den entsprechenden Wert in die for-Schleife schreiben kann.
2. Die beiden Listen die bei der unpack-Methode rauskommen irgendwie wieder Spalten zu verwandeln

Sorry das ich nerve, vielleicht habt ihr ja noch eine letzte Idee
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Mit data.shape bekommst du Größe der Zeilen und Spalten.

Die Schleife muss aber so aussehen:

Code: Alles auswählen

for i in xrange(data.shape[1]):
    numpy.random.shuffle(data[:,i])
BlackJack

@vucub-caquix: Was gibt es denn da noch in den Spalten? Vielleicht ist `numpy` ja nicht das richtige, denn das kann am besten mit Arrays mit Zahlen umgehen, am besten wenn die auch noch vom gleichen Typ sind. Also was sind dass denn überhaupt für Daten?

Das eine "list comprehension" eine Liste erzeugt, die natürlich keine `transpose()`-Methode kennt, wäre jetzt schon wieder Python-Basiswissen.

Und dass man die Dimensionen eines `numpy`-Arrays über das `shape`-Attribut herausbekommt, hätte man sicher irgendwo in der `numpy`-Dokumentation erfahren:

Code: Alles auswählen

In [109]: a
Out[109]:
array([[1, 3],
       [2, 4],
       [3, 1],
       [4, 2],
       [5, 5]])

In [110]: a.shape
Out[110]: (5, 2)
Wenn diese Spalten "beliebiges" enthalten können, also nicht nur Zahlen eines bestimmten Typs, dann solltest Du vielleicht doch mal Python lernen und das Problem selber lösen. Also überlegen, was "transponieren" eigentlich bedeutet und das programmieren.

Das Format der Daten ist für die gewünschte Operation auch anscheinend auch ziemlich ungünstig.
vucub-caquix
User
Beiträge: 9
Registriert: Mittwoch 28. Oktober 2009, 10:33

Code: Alles auswählen

for i in xrange(data.shape[1]):
    numpy.random.shuffle(data[:,i])
funktioniert! Super vielen Dank, damit ist das Programm fertig
Antworten