Vektoren in for-schleife zu Matrix zusammensetzen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Hallo Zusammen,

hab viele Ansätze im Netz gefunden ... und eigentlich kann das nicht so schwer sein ... komm trotzdem gerade nicht vorwärts :roll:

Kann mir jemand ein Code-Sample geben, wie man einen Vektor der sich mit jedem for-loop ändert zu einer Matrix hinzufügt, deren letztendliche Größe erstmal unbekannt ist?

Wie macht man so etwas, wenn die Vektoren nun Variable Längen haben?

Viele Grüße
Inco
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zeig doch mal was du hast.

Und Vektoren unterschiedlicher Laenge wuerde ich nicht in einer Matrix, sondern einer Liste speichern. Wie Listen funktionieren steht im Grundlagentutorial.
BlackJack

@incoggnito: Was hast Du denn versucht und wo liegt das konkrete Problem?

Der Ansatz wäre die Vektoren in einer Liste zu sammeln und wenn man alle hat `numpy.stack()` oder eine verwandte Funktion zu verwenden um die dann zu einem Array zusammenzusetzen.

Wenn Du tatsächlich immer auf dem selben Vektor operierst und den veränderst, dann musst Du Kopien an die Liste anhängen.

Wie soll die Matrix denn aussehen wenn die Vektoren unterschiedliche Länge haben? Und wenn die Vektoren unterschiedliche Länge haben, dann kann es sich ja nicht immer um den selben Vektor handeln‽
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Danke, für euere Hilfestellung.
Ich hab da wohl noch Grundlagenprobleme (bin von Matlab umgestiegen).

Code: Alles auswählen

y_m = []
for k in len(files):
    #load matfile
    mat = loadmat(files[k])    
    x=mat['Data1_X_TF_1Y__1Y']
    y=mat['Data1_TF_1Y__1Y']
    y_m.append(y)
Code der nicht funktioniert sieht so aus ... ist aber bei weitem nicht mehr der erste Versuch ...

@BlackJack hast du ein Beispiel dafür?
Falls die vektoren unterschiedliche Längen haben, sollen die kleineren Arrays mit Nullen aufgefüllt werden.

Viele Grüße
Inco
Zuletzt geändert von Anonymous am Freitag 28. Juli 2017, 10:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@incoggnito: ich sehe jetzt nicht, wie der Code, den Du zeigst nicht funktioniert. Über files kann direkt iteriert werden und nicht über den Index (ähnlich wie in Matlab):

Code: Alles auswählen

y_m = []
for mat_filename in files:
    mat = loadmat(mat_filename)    
    x=mat['Data1_X_TF_1Y__1Y']
    y=mat['Data1_TF_1Y__1Y']
    y_m.append(y)
y_matrix = numpy.conctatenate(y_m)
Wenn die Matrizen unterschiedliche Anzahl an Spalten haben, so geht "conctatenate" (cat bei Matlab) auch in Matlab nicht; da mußt Du dann selbst eine 0-Matrix entsprechender Größe generieren und füllen.
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Nun habe ich 3 arrays in einer Liste... soweit so gut.

Code: Alles auswählen

 y_matrix = numpy.conctatenate(y_m) 
Nach dem Befehl bekomme ich ein Spaltenarray mit 13108 Einträgen ... :K
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@incoggnito: Niemand hier kann wissen, ob Du Zeilen- oder Spaltenvektoren hast. Schulterzucken bringt Dich nicht weiter. Dokumentation lesen ist erfolgsversprechender.
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

In y versteckt sich ein Spaltenarray.
BlackJack

@incoggnito: Ui, bin ein bisschen langsam heute — die Antwort bezieht sich noch auf den Beitrag mit ``for`` über eine Zahl. Das scheitert ja schon an der ``for``-Schleife weil man nicht über eine Zahl iterieren kann:

Code: Alles auswählen

In [6]: files = []

In [7]: for k in len(files):
   ...:     pass
   ...: 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-0cb004cb6789> in <module>()
----> 1 for k in len(files):
      2     pass

TypeError: 'int' object is not iterable
Das sind Grundlagen die Du Dir selbst erarbeiten musst. In der Python-Dokumentation ist beispielsweise ein Tutorial in dem unter anderem auch Schleifen in Python erklärt werden.

Da solltest Du dann auch kennenlernen das man in Python über die Elemente von Sequenztypen wie Listen *direkt* iterieren kann, ohne den Umweg über eine Indexlaufvariable.

Nach dem Python-Tutorial solltest Du das Numpy-Tutorial durcharbeiten. Zusätzlich gibt es bei der Numpy-Dokumentation auch noch speziell etwas für Leute die von Matlab kommen.

Sowohl beim Durcharbeiten von den Tutorials als auch beim Entwickeln von (Teil)Lösungen ist eine interaktive Python-Shell Dein Freund. Da kannst Du Code live ausprobieren und Teilausdrücke testen und entwickeln. IPython ist eine ganz nette Erweiterung der Standard-Shell und auch Grundlage von Jupyter-Notebooks, die im wissenschaftlichen Bereich auch ganz praktisch sind.

Beispiele für Numpy-Funktionen finden sich in der Numpy-Dokumentation und via `help()` direkt auf den jeweiligen Objekten. Beziehungsweise in IPython mit weniger Tipparbeit mit einem angehängten ``?``.

Zum Auffüllen mit 0en muss man ja die Maximallänge kennen. Falls die nicht vorher bekannt ist, würde ich die Vektoren in der Liste sammeln, dann die maximale Länge ermitteln (`max()`-Funktion + `key`-Argument) und mit `numpy.zeros()` gleich das ganze Array erstellen und dann in einer Schleife die Vektoren per „slicing“ jeweils an den Anfang der jeweiligen Zeile in dem Array schreiben. Dabei ist für die Schleife die `zip()`-Funktion interessant (`itertools.izip()` in Python 2.x) und der Umstand das `numpy` soweit wie möglich „views“ statt Kopien der Daten verwendet. Wenn man also über die Zeilen des Arrays iteriert und die Zeile in der Schleife verändert, dann verändert sich auch das zugrunde liegende Array.

`x` in Deinem Beispiel wird gar nicht verwendet‽ Ich erwähne das, weil man den Code ansonsten mit einer „list comprehension“ kompakter ausdrücken könnte.
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

@BlackJack Danke für den ausführlichen Text, damit hab ich nun auch ein paar Zusammenhänge verstanden.
Von welchen Tutorial ist die Rede ... hört sich so nach einem konkreten an?

Das x sollte später noch an das Array gehängt werden ....

Viele Grüße
Inco
BlackJack

@incoggnito: Ich meinte jeweils die Tutorials in/bei den Dokumentationen von Python beziehungsweise Numpy.

*Das* `x` ist ja ein `x` pro Schleifendurchlauf. Das müsste dann auch in einer Liste gespeichert werden, sonst hast Du am Ende der Schleife ja nur den `x`-Wert aus der letzten Datei.
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Das 'x' bleibt immer gleich, ist eine statische Frequenzachse .... könnte das eigentlich aus der Schleife nehmen.
BlackJack

@incoggnito: Oder man programmiert defensiv und prüft ob das tatsächlich immer die gleichen Werte sind.
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Also bei mir ist tatsächlich ein größerer Groschen gefallen, vielen Dank dafür.
Den ersten Teil konnte ich durch die Tutorial und die Denkanstöße hier schnell lösen, auch mit ungleichen Vektorlängen würde ich es vermutlich nun hinbekommen ... nur ist das überhaupt notwendig, oder kann man mit pandas direkt auch die Listen in eine Excel-Vorlage einfügen?

Viele Grüße
Inco
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Hab die Antwort selbst gefunden, mit xlswrite geht das sehr einfach.
Antworten