Hallo Zusammen,
hab viele Ansätze im Netz gefunden ... und eigentlich kann das nicht so schwer sein ... komm trotzdem gerade nicht vorwärts
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
Vektoren in for-schleife zu Matrix zusammensetzen
@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‽
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‽
-
- 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 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
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)
@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.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@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):
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.
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)
-
- User
- Beiträge: 53
- Registriert: Donnerstag 27. April 2017, 09:28
Nun habe ich 3 arrays in einer Liste... soweit so gut.
Nach dem Befehl bekomme ich ein Spaltenarray mit 13108 Einträgen ... :K
Code: Alles auswählen
y_matrix = numpy.conctatenate(y_m)
-
- User
- Beiträge: 53
- Registriert: Donnerstag 27. April 2017, 09:28
In y versteckt sich ein Spaltenarray.
@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:
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.
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
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.
-
- 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
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
@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.
*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.
-
- 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.
@incoggnito: Oder man programmiert defensiv und prüft ob das tatsächlich immer die gleichen Werte sind.
-
- 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
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
-
- User
- Beiträge: 53
- Registriert: Donnerstag 27. April 2017, 09:28
Hab die Antwort selbst gefunden, mit xlswrite geht das sehr einfach.