Diagonale von csr Matrix ändern

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
götze1988
User
Beiträge: 13
Registriert: Samstag 6. August 2016, 13:02

Hey Leute,

ich würde gernen einen vektor auf der Hauptdiagonale einer csv Matrix anordnen. Dazu folgender Code:

Code: Alles auswählen

B=np.zeros((P-1,N-1))



for i in range(1,N):
 B[:,i-1]=np.array(a(x1[i],x2[1:P]))

#B=B.reshape(((P-1)*(N-1)),1)
B3=B.flatten()



B1=sparse.identity((P-1)*(N-1))
B1=sparse.csr_matrix(B1)


B1=B1.setdiag(B3)
wobei a eine funktion (x,y)--> a(x,y) ist. Jetzt liefert mir python für print(B1) "none", was ich nicht verstehe, da ich doch eigentlich die Matrix B1 mit den Einträgen des Vektors B3 auf der Diagonalen erhalten müsste?

Lg und Vielen Dank im Voraus,
Götze
Zuletzt geändert von Anonymous am Donnerstag 25. August 2016, 14:43, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@götze1988: Die `setdiag()`-Methode setzt die Diagonalwerte in der Matrix auf der die Methode aufgerufen wurde und gibt dann `None` zurück, weil in Python jeder Aufruf etwas zurückgeben muss, aber die Methode keinen Rückgabewert hat. Warum sollte die denn auch den Wert verändern und zurückgeben? Es gibt Sprachen/Bibliotheken wo so etwas üblich ist um ein ”Fluid”-Interface zu haben, in Python ist das eher verpönt. Da unterscheidet man in der Regel deutlich zwischen Methoden die ein Objekt verändern und solchen die etwas zurückgeben.
götze1988
User
Beiträge: 13
Registriert: Samstag 6. August 2016, 13:02

Vielen Danke für die Antwort. Gibt es dann keine Möglichkeit zu sehen, wie diese neue Matrix B aussieht ?
LG
götze1988
User
Beiträge: 13
Registriert: Samstag 6. August 2016, 13:02

Zudem habe ich gerade gemerkt, dass ich mit der auf der Diagonalen veränderten Matrix nicht weiterrechnen kann, da es keinen return gibt..wie löse ich das am besten?
Lg
BlackJack

@götze1988: Äh, die Methode gibt `None` zurück. Und das bindest Du an den Namen `B1`. Wenn Du das nicht willst, dann mach das doch einfach nicht! Einfach nur dann etwas an einen Namen zuweisen wenn man das wirklich an den Namen zuweisen will.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

sparse.identity und sparse.csr_matrix sind Funktionen mit Rückgabewert, man tut was rein und bekommt das Ergebnis zurück, wie z.B. bei der cos-Funktion. Das Ergebnis von sparse.identity und sparse.csr_matrix ist jeweils ein Matrix-Objekt.

setdiag ist eine Methode der Matrix-Klasse. Du rufst diese Methode auf um das Matrix-Objekt zu verändern. Es wird dabei kein neues Matrix-Objekt erzeugt, sondern das alte Matrix-Objekt wird verändert.

Du brauchst nicht für jedes Zwischenergebnis eine Variable anlagen (Informatik-Sprech: "Wert binden"). Variablen sollten gute Namen haben. Wenn Du Mathe programmierst orientier Dich am Theorie-Text, Matrizen haben Großbuchstaben und Vektoren haben (oftmals) Kleinbuchstaben. Im Theorietext würde auch niemand auf die Idee kommen Matrizen und Vektoren der Reihe nach so wie sie kommen von B1 bis BN durchzunummerieren.

Code: Alles auswählen

b=np.zeros((P-1,N-1))   

for i in range(1,N): 
    b[:,i-1]=np.array(a(x1[i],x2[1:P])) 
	
B1=sparse.csr_matrix( sparse.identity((P-1)*(N-1)) )
B1.setdiag( b.flatten() )
a fool with a tool is still a fool, www.magben.de, YouTube
götze1988
User
Beiträge: 13
Registriert: Samstag 6. August 2016, 13:02

Alles klar, habe es jetzt mit spdiags gemacht. Danke für die Hilfe.
Lg
Antworten