2016-04-12 10 views
0

Ich muss die Zeilen einer Matrix summieren, negieren, und setzen sie auf die Diagonale entweder der ursprünglichen Matrix oder einer Matrix, wo die Off-Diagonale Terme sind Null. Was funktioniert istPython negative Summe von Zeilen auf Matrix-Diagonale effizient

Mat2 = numpy.diag(numpy.negative(numpy.squeeze(numpy.asarray(numpy.sum(Mat1,axis=1)))) 

Gibt es eine sauberere/schnellere Möglichkeit, dies zu tun? Ich versuche, etwas Code zu optimieren.

+0

Benötigen Sie wirklich das 'numpy.asarray'? - Es wird nicht viel für Ihre Laufzeit tun, aber der Code könnte ein wenig handlicher ohne es aussehen. Auch "numpy.negative (...)" kann prägnanter als "-..." geschrieben werden. Wiederum keine Laufzeitvorteile, aber etwas kürzerer Code. – mgilson

+0

Ich hatte ein Problem, wo die Summe etwas mit einem zusätzlichen Paar Klammern ausgeben und dann numpy.diag() eine Matrix ausgeben, die ein einzelnes Element enthält. Ich bin nicht allzu besorgt um die Beschleunigung (für dieses spezielle Stück), aber was ich gerade jetzt habe, ist wirklich hässlich auf der Suche nach einem scheinbar einfachen Problem. – chia

Antwort

3

denke ich np.diag(-Mat1.A.sum(1)) würde die gleichen Ergebnisse produzieren:

>>> Mat1 = np.matrix(np.random.rand(3,3)) 
>>> Mat1 
matrix([[ 0.35702661, 0.0191392 , 0.34793743], 
     [ 0.9052968 , 0.16182118, 0.2239716 ], 
     [ 0.57865916, 0.77934846, 0.60984091]]) 
>>> Mat2 = np.diag(np.negative(np.squeeze(np.asarray(np.sum(Mat1,axis=1))))) 
>>> Mat2 
array([[-0.72410324, 0.  , 0.  ], 
     [ 0.  , -1.29108958, 0.  ], 
     [ 0.  , 0.  , -1.96784852]]) 
>>> np.diag(-Mat1.A.sum(1)) 
array([[-0.72410324, 0.  , 0.  ], 
     [ 0.  , -1.29108958, 0.  ], 
     [ 0.  , 0.  , -1.96784852]]) 

Beachten Sie, dass Matrizen ein wenig Kopfschmerzen in numpy sind - Arrays im Allgemeinen viel bequemer ist - und der einzige syntaktische Vorteil, den sie hatten, nämlich einfachere Multiplikation, zählt jetzt nicht mehr, da wir @ für Matrixmultiplikation im modernen Python haben.

Wenn ein Array anstelle einer Matrix wäre, würden Sie die .A dort nicht benötigen.

+0

Das ist schön. Ich danke dir sehr! – chia