2016-07-11 14 views
1

Ich habe ein einfaches Problem und ich kann nicht herausfinden, wie man es löst.Ersetzen Sie alle Elemente einer Matrix durch ihre Inversen

Hier ist eine Matrix: A = np.array([[1,0,3],[0,7,9],[0,0,8]]).

Ich möchte einen schnellen Weg finden, um alle Elemente dieser Matrix durch ihre Inversen zu ersetzen, natürlich ohne die Null-Elemente.

Ich weiß, dank der Suchmaschine von Stackoverflow, wie man ein Element durch einen gegebenen Wert mit einer Bedingung ersetzen kann. Im Gegenteil, ich denke, ich nicht, wie Elemente durch neue Elemente zu ersetzen, je nach den vorherigen (zB squared Elementen, Umkehrungen, etc.)

Antwort

3

Und nur ein Hinweis auf Antti Haapala Antwort, (Leider kann ich noch nicht kommentieren) , wenn Sie die 0en halten wollte, Sie

B=1./A #I use the 1. to make sure it uses floats 
B[B==np.inf]=0 
verwenden könnte
5

Verwenden 1./A (beachten Sie den Punkt für Python 2):

>>> A 
array([[1, 0, 3], 
     [0, 7, 9], 
     [0, 0, 8]], dtype) 
>>> 1./A 
array([[ 1.  ,   inf, 0.33333333], 
     [  inf, 0.14285714, 0.11111111], 
     [  inf,   inf, 0.125  ]]) 

Oder wenn Ihr Array dtype Schwimmer hat, können Sie es ohne Warnungen an Ort und Stelle tun:

>>> A = np.array([[1,0,3], [0,7,9], [0,0,8]], dtype=np.float64) 
>>> A[A != 0] = 1./A[A != 0] 
>>> A 
array([[ 1.  , 0.  , 0.33333333], 
     [ 0.  , 0.14285714, 0.11111111], 
     [ 0.  , 0.  , 0.125  ]]) 

wir A != 0 Hier verwenden nur die Elemente auswählen das sind nicht null.

Allerdings, wenn Sie versuchen, diese auf dem ursprünglichen Array würden Sie

array([[1, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]]) 

, weil Ihr Array nur ganze Zahlen halten konnte, und inverse aller anderen worden wäre, auf 0 abgerundet


Generell sind alle der numpy Sachen auf Arrays tut elementweise vektorisiert Transformationen, so dass auf quadratischen Elementen,

>>> A = np.array([[1,0,3],[0,7,9],[0,0,8]]) 
>>> A * A 
array([[ 1, 0, 9], 
     [ 0, 49, 81], 
     [ 0, 0, 64]]) 
Verwandte Themen