Matrix aus leerer Matrix erstellen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
BunteSocke
User
Beiträge: 4
Registriert: Sonntag 1. Juli 2018, 13:15

Hallo zusammen,
ich bin mit Python noch ganz am Anfang...
Ich möchte eine Matrix aufbauen, und zwar indem ich nach und nach Zeilen hinzufüge.

Meine erste Idee, nämlich beginnend von der leeren Matrix mit np.concatenate Zeilen anzufügen, hat leider nicht funktioniert...

Code: Alles auswählen

import numpy as np

Matrix = np.array([]);

first_row = np.array([1, 0, 1]);
second_row = np.array([0, 0, 1]);

Matrix = np.concatenate((Matrix, first_row));
Was auch nicht funktioniert, ist im obigen Beispiel

Code: Alles auswählen

Matrix = np.array([[]]);
zu benutzen (macht keinen Unterschied).

Leider steht nicht vorher fest, ob die Matrix Zeilen hat bzw. wie viele...

Hat jemand Ideen? :)

Liebe Grüße & schönen Sonntag,
Socke
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also erst einmal nicht `concatenate()` *so* verwenden wenn Du nicht eindimensionale Arrays zu einem längeren eindimensionalen Array zusammenfügen willst. Ich tippe da eher auf `vstack()`:

Code: Alles auswählen

In [130]: first_row = np.array([1, 0, 1])

In [131]: second_row = np.array([0, 0, 1])

In [132]: np.vstack([first_row, second_row])
Out[132]: 
array([[1, 0, 1],
       [0, 0, 1]])
Bei dem Beispiel könnte einem jetzt die Idee kommen die Zeilen erst alle in einer Liste zu sammeln und am Ende dann zu einem zweidimensionalen Array zusammen zu fügen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
BunteSocke
User
Beiträge: 4
Registriert: Sonntag 1. Juli 2018, 13:15

Ah ok, vstack ist das, was ich meinte.

Nur wie mache ich das beginnend von der leeren Matrix?
Hier mal zur Verdeutlichung, wie das das im Programmablauf aussehen soll.

Code: Alles auswählen

import numpy as np

Matrix = np.array([]);

for i in range(10):
    temp = np.array([i for j in range(3)])
    if "Condition on temp":
        Matrix = np.vstack(Matrix, temp);
Dieser Abschnitt soll dazu dienen, worauf ich hinaus will... Das Problem ist, dass man nicht an das "leere" Array anfügen kann, aber ich nicht so richtig weiß, wie ich das sonst in eine Matrix kriege...
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

BunteSocke hat geschrieben: Sonntag 1. Juli 2018, 13:32

Code: Alles auswählen

Matrix = np.array([]);

first_row = np.array([1, 0, 1]);
second_row = np.array([0, 0, 1]);

Matrix = np.concatenate((Matrix, first_row));
Was mir hierbei komisch vorkommt, sind die Semikolons ; am Ende der Zeilen, warum?
Ich kenne das aus MATLAB oder Octave.
Das kann man nicht so einfach 1:1 kopieren.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@BunteSocke: Du sammelst erst alle Zeilen in einer Liste und erzeugst dann zum Schluß die Matrix.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

BunteSocke hat geschrieben: Sonntag 1. Juli 2018, 14:11 Das Problem ist, dass man nicht an das "leere" Array anfügen kann, aber ich nicht so richtig weiß, wie ich das sonst in eine Matrix kriege...
Dann erzeuge doch ein numpy array, an dem du anhängen kannst.

Code: Alles auswählen

matrix = np.array([1,2,3])

for i in range(10):
    temp = np.array([i for j in range(3)])
    if "Condition on temp":
        matrix = np.vstack((matrix, temp))

matrix = matrix[1:,:]
und entfernst zum Schluss diese erste Reihe
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@ThomasL: das ist immer eine sehr gute Idee, irgendwo Dummywerte reinzuschreiben, um sie zum Schluß wieder wegzuschmeißen. :evil:

Also nochmal mit der Liste:

Code: Alles auswählen

import numpy as np

rows = []
for i in range(10):
    row = np.array(...)
    if "Condition on row":
        rows.append(row)

matrix = np.vstack(rows)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Nun ja, kann man so oder so sehen. Wenn man weiß was man macht ist das imho ok.
Meine Methode hätte den Vorteil, dass np.vstack kein "ValueError: need at least one array to concatenate" liefert,
wenn die if-Kondition nie zutrifft und der leeren Liste rows keine row hinzugeführt wird.
Dies müsste man dann z.B. durch ein if rows: abfangen.

Und schau doch mal in meine Sig.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ThomasL: Wenn man nicht weiss was man da macht, und das betrifft mindestens alle Leser die das nicht selber geschrieben haben, muss man das aber Kommentieren, dass das Dummywerte sind und das die am Ende wieder entfernt werden. Denn offensichtlich ist das nicht, oder höchstens weil in dem Code in der Schleife so wenig passiert und man das Ende auf einen Blick sieht.

Aber der Code hat auch völlig unnötig quadratische Laufzeit weil die immer grösser werdende Datenmenge laufend im Speicher umher kopiert wird, ohne dass das irgendeinen Sinn hat.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
BunteSocke
User
Beiträge: 4
Registriert: Sonntag 1. Juli 2018, 13:15

Vielen Dank für die Hilfe, das hat bei meinem Problem weitergeholfen! :)
Antworten