Seite 1 von 1

Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 09:39
von incoggnito
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

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 09:48
von __deets__
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.

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 09:55
von 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‽

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 10:07
von incoggnito
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

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 10:28
von Sirius3
@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.

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 10:40
von incoggnito
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

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 10:44
von Sirius3
@incoggnito: Niemand hier kann wissen, ob Du Zeilen- oder Spaltenvektoren hast. Schulterzucken bringt Dich nicht weiter. Dokumentation lesen ist erfolgsversprechender.

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 10:47
von incoggnito
In y versteckt sich ein Spaltenarray.

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 10:48
von 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.

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 10:55
von incoggnito
@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

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 11:00
von 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.

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 11:09
von incoggnito
Das 'x' bleibt immer gleich, ist eine statische Frequenzachse .... könnte das eigentlich aus der Schleife nehmen.

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 12:32
von BlackJack
@incoggnito: Oder man programmiert defensiv und prüft ob das tatsächlich immer die gleichen Werte sind.

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 13:12
von incoggnito
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

Re: Vektoren in for-schleife zu Matrix zusammensetzen

Verfasst: Freitag 28. Juli 2017, 13:48
von incoggnito
Hab die Antwort selbst gefunden, mit xlswrite geht das sehr einfach.