Seite 1 von 1

Diagonale von csr Matrix ändern

Verfasst: Donnerstag 25. August 2016, 14:10
von götze1988
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

Re: Diagonale von csr Matrix ändern

Verfasst: Donnerstag 25. August 2016, 14:51
von 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.

Re: Diagonale von csr Matrix ändern

Verfasst: Donnerstag 25. August 2016, 15:03
von götze1988
Vielen Danke für die Antwort. Gibt es dann keine Möglichkeit zu sehen, wie diese neue Matrix B aussieht ?
LG

Re: Diagonale von csr Matrix ändern

Verfasst: Donnerstag 25. August 2016, 16:12
von götze1988
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

Re: Diagonale von csr Matrix ändern

Verfasst: Donnerstag 25. August 2016, 17:23
von 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.

Re: Diagonale von csr Matrix ändern

Verfasst: Freitag 26. August 2016, 08:13
von MagBen
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() )

Re: Diagonale von csr Matrix ändern

Verfasst: Freitag 26. August 2016, 14:39
von götze1988
Alles klar, habe es jetzt mit spdiags gemacht. Danke für die Hilfe.
Lg