Seite 1 von 1

Bedingte und zeilenweise Veränderung von numpy-Matrizen

Verfasst: Sonntag 17. August 2014, 23:36
von EyDu
Hallo.

Ich habe da ein kleines numpy-Problem, welches sich bestimmt elegant lösen lässt. Nur leider sehe ich nicht wie. Das Problem ist ganz einfach: Ich habe eine nxn-Matrix und jedes Element kann den Wert 0 oder 1 annehmen, also eine ganz normale Adjazenzmatrix. Nun würde ich gerne, abhängig von der Anzahl der Elemente in einer Zeile, die Zeilen verändern. Enthält eine Zeile keine 1, soll sollen alle Elemente der Zeile auf einen konstanten Wert 1.0/n gesetzt werden. Andernfalls sollen alle Elemente der Zeile durch die Anzahl der Elemente der Zeile dividiert werden. Am Ende ergibt das dann eine (transponierte) stoachastische Matrix.

Der offensichtliche Ansatz ist natürlich eine Schleife über die Zeilen:

Code: Alles auswählen

cnt = count_rows(m)
    
for index, (c, row) in enumerate(itertools.izip(cnt, m)):
    if c:
        row /= c
    else:
        row[:] = t
"cnt" ist ein numpy-array mit n Einträgen, jeder Eintrag gibt die Anzahl der Elemente pro Zeile an. cnt[0] die Anzahl der Elemente in der ersten Zeile, cnt[1] der zweiten, etc.

Natürlich lässt sich das ganze Problem umschiffen, indem mit ``np.vstack`` (oder ohne) und einem Generatorausdruck einfach eine neue Matrix konstruiert, mir geht es jetzt aber eher ums Prinzip :roll: Gibt es zum zeilenweisen Verändern der Matrix einen schönen Einzeiler nur mittels numpy?

Sebastian

Re: Bedingte und zeilenweise Veränderung von numpy-Matrizen

Verfasst: Montag 18. August 2014, 07:54
von Sirius3
@EyDu: wie wär's mit

Code: Alles auswählen

cnt = m.sum(1).reshape(-1,1)
m /= cnt
m[(cnt==0).nonzero()[0], :] = t

Re: Bedingte und zeilenweise Veränderung von numpy-Matrizen

Verfasst: Montag 18. August 2014, 22:55
von EyDu
Danke, das sieht schon deutlich besser aus als mein Ansatz.