Inverse einer Matrix mit numpy

74

Ich möchte numpy verwenden, um die Umkehrung zu berechnen. Aber ich bekomme eine Fehlermeldung:

'numpy.ndarry' object has no attribute I

Um die Inverse einer Matrix in Numpy zu berechnen, sagen wir Matrix M, sollte es einfach sein: print M.I

Hier ist der Code:

x = numpy.empty((3,3), dtype=int)
for comb in combinations_with_replacement(range(10), 9):
   x.flat[:] = comb
   print x.I

Ich gehe davon aus, dass dieser Fehler auftritt, weil x jetzt flach ist und Ider Befehl ' ' daher nicht kompatibel ist. Gibt es dafür eine Lösung?

Mein Ziel ist es, die INVERSE MATRIX jeder möglichen numerischen Matrixkombination zu drucken.

Jake Z.
quelle
1
hat auch die andere Antwort kommentiert, aber Sie müssen x als Matrix definieren, np.matrix(x)damit die .IMethode verfügbar ist.
M4rtini

Antworten:

96

Das IAttribut existiert nur für matrixObjekte, nicht für ndarrays. Sie können numpy.linalg.invArrays invertieren:

inverse = numpy.linalg.inv(x)

Beachten Sie, dass die Art und Weise, wie Sie Matrizen generieren, nicht alle invertierbar sind. Sie müssen entweder die Art und Weise ändern, in der Sie Matrizen generieren, oder diejenigen überspringen, die nicht invertierbar sind.

try:
    inverse = numpy.linalg.inv(x)
except numpy.linalg.LinAlgError:
    # Not invertible. Skip this one.
    pass
else:
    # continue with what you were doing

Wenn Sie alle 3x3-Matrizen mit Elementen aus [0, 10) durchgehen möchten, möchten Sie Folgendes:

for comb in itertools.product(range(10), repeat=9):

anstatt combinations_with_replacement, oder Sie überspringen Matrizen wie

numpy.array([[0, 1, 0],
             [0, 0, 0],
             [0, 0, 0]])
user2357112 unterstützt Monica
quelle
'Modul'-Objekt hat kein Attribut inv ... = /
Jake Z
Ja, das habe ich versucht. Ich erhalte den Fehler "Singular Matrix". O_O
Jake Z
3
@JakeZ: Das liegt daran, dass Sie versuchen, nicht invertierbare Matrizen zu invertieren. Eine der Matrizen, die Sie generieren, ist beispielsweise die 0-Matrix.
user2357112 unterstützt Monica
Tolle! Ich habe völlig vergessen, nach singulären Matrizen zu suchen. Haha, danke. Lief wie am Schnürchen.
Jake Z
1
@anu: Das ist ein lineares Algebra-Problem, kein Programmierproblem. In Bezug auf die lineare Algebra ist Ihre erste Matrix invertierbar und Ihre anderen beiden nicht. Es gibt keinen Grund zu der Annahme, dass alle quadratischen Matrizen eine Inverse haben.
Benutzer2357112 unterstützt Monica
17

Eine andere Möglichkeit, dies zu tun, besteht darin, die numpy- matrixKlasse (anstelle eines numpy-Arrays) und das IAttribut zu verwenden. Zum Beispiel:

>>> m = np.matrix([[2,3],[4,5]])
>>> m.I
matrix([[-2.5,  1.5],
       [ 2. , -1. ]])
Dagrha
quelle
Ich würde diese Methode bevorzugen, da sie einfacher ist. Aber beide arbeiten genau gleich.
Parsa
Obwohl praktisch, wird von der Verwendung np.matrixoffiziell abgeraten, da dies zu Unklarheiten für np.arrayBenutzer führt: scipy.linalg
Shahrokh Bah
11

Inverse einer Matrix mit Python und Numpy:

>>> import numpy as np
>>> b = np.array([[2,3],[4,5]])
>>> np.linalg.inv(b)
array([[-2.5,  1.5],
       [ 2. , -1. ]])

Nicht alle Matrizen können invertiert werden. Zum Beispiel sind singuläre Matrizen nicht invertierbar :

>>> import numpy as np
>>> b = np.array([[2,3],[4,6]])
>>> np.linalg.inv(b)

LinAlgError: Singular matrix

Lösung des singulären Matrixproblems:

Versuchen Sie, die Singular Matrix-Ausnahme abzufangen, und fahren Sie fort, bis Sie eine Transformation finden, die Ihren vorherigen Kriterien entspricht UND auch invertierbar ist.

Intuition, warum Matrixinversion nicht immer durchgeführt werden kann; wie in singulären Matrizen:

Stellen Sie sich einen alten Overhead-Filmprojektor vor, der ein helles Licht durch den Film auf eine weiße Wand strahlt. Die Pixel im Film werden auf die Pixel an der Wand projiziert.

Wenn ich die Filmprojektion auf einem einzelnen Bild stoppe, sehen Sie die Pixel des Films an der Wand und ich bitte Sie, den Film basierend auf dem, was Sie sehen, neu zu generieren. Das ist einfach, sagen Sie, nehmen Sie einfach die Umkehrung der Matrix, die die Projektion durchgeführt hat. Eine Umkehrung einer Matrix ist die Umkehrung der Projektion.

Stellen Sie sich nun vor, der Projektor wäre beschädigt, und ich habe ein verzerrtes Objektiv vor den Film gestellt. Jetzt werden mehrere Pixel auf dieselbe Stelle an der Wand projiziert. Ich habe Sie erneut gebeten, "diese Operation mit der inversen Matrix rückgängig zu machen". Sie sagen: "Ich kann nicht, weil Sie Informationen durch die Linsenverzerrung zerstört haben. Ich kann nicht dorthin zurückkehren, wo wir waren, weil die Matrix entweder Singular oder Degenerate ist."

Eine Matrix, mit der einige Daten in andere Daten umgewandelt werden können, kann nur invertiert werden, wenn der Prozess ohne Informationsverlust rückgängig gemacht werden kann. Wenn Ihre Matrix nicht invertiert werden kann, definieren Sie Ihre Projektion möglicherweise mithilfe einer Guess-and-Check-Methode, anstatt einen Prozess zu verwenden, der eine nicht beschädigende Transformation garantiert.

Wenn Sie eine Heuristik oder eine weniger als perfekte mathematische Genauigkeit verwenden, müssen Sie einen anderen Prozess definieren, um Verzerrungen zu verwalten und unter Quarantäne zu stellen, damit die Programmierung durch Brownsche Bewegung fortgesetzt werden kann.

Quelle:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html#numpy.linalg.inv

Eric Leschinski
quelle
2

Was ist mit inv ?

Beispiel: my_inverse_array = inv (my_array)

user1330052
quelle
Ich habe es versucht, aber ich erhalte den Fehler "Singular Matrix" ... höchstwahrscheinlich, weil er abgeflacht ist ... Ich frage mich, ob es eine Möglichkeit gibt, ihn wieder in seinen ursprünglichen Zustand zu bringen und ihn dann umzukehren.
Jake Z
Es ist möglicherweise einfacher, den ursprünglichen Status zu speichern und dann darauf zurückzugreifen, wie bei einem Objekt, das den aktuellen Status und ein Attribut enthält, das angibt, was es ursprünglich war. numpy.linalg.lstsq wird versuchen, Ihnen eine Lösung der kleinsten Quadrate zu geben, aber ich kenne nichts besonders Sauberes.
user1330052