2017-01-25 2 views
3

Ich habe ein Array A deren Form (N, N, K) und würde ein anderes Array B mit der gleichen Form, wo B[:, :, i] = np.linalg.inv(A[:, :, i]) berechnen möge.Compute inverse 2D-Arrays entlang der dritten Achse in einem 3D-Array ohne Schleifen

Als Lösungen, ich sehe map und for Schleifen, aber ich frage mich, ob numpy eine Funktion, dies zu tun gibt (ich habe np.apply_over_axes versucht, aber es scheint, dass es nur 1D-Array verarbeiten kann).

mit einem for loop:

B = np.zeros(shape=A.shape) 
for i in range(A.shape[2]): 
    B[:, :, i] = np.linalg.inv(A[:, :, i]) 

mit map:

B = np.asarray(map(np.linalg.inv, np.squeeze(np.dsplit(A, A.shape[2])))).transpose(1, 2, 0) 

Antwort

4

Für eine invertierbare Matrix M wir haben inv(M).T == inv(M.T) (die Transponierte der invers zu dem Inversen der Transponierten gleich).

Seit np.linalg.inv sende ist, kann Ihr Problem einfach gelöst werden A Umsetzung, ruft inv und zur Umsetzung des Ergebnisses:

B = np.linalg.inv(A.T).T 

Zum Beispiel:

>>> N, K = 2, 3 
>>> A = np.random.randint(1, 5, (N, N, K)) 
>>> A 
array([[[4, 2, 3], 
     [2, 3, 1]], 

     [[3, 3, 4], 
     [4, 4, 4]]]) 

>>> B = np.linalg.inv(A.T).T 
>>> B 
array([[[ 0.4 , -4. , 0.5 ], 
     [-0.2 , 3. , -0.125]], 

     [[-0.3 , 3. , -0.5 ], 
     [ 0.4 , -2. , 0.375]]]) 

Sie können die Werte von B überprüfen Vergleiche die Inversen der Arrays in A wie erwartet:

>>> all(np.allclose(B[:, :, i], np.linalg.inv(A[:, :, i])) for i in range(K)] 
True 
+0

Wow, ich hätte nie gedacht, dass "inv" übertragbar war, aber jetzt, wo ich darüber nachdenke, warum nicht! Gute Arbeit, Herr/Frau! –

+0

Tatsächlich habe ich die 'inv' Dokumentation zu schnell gelesen! – floflo29

Verwandte Themen