Omgekeerd van een matrix met behulp van numpy

Ik wil graag numpe gebruiken om het omgekeerde te berekenen. Maar ik krijg een foutmelding:

'numpy.ndarry' object has no attribute I

Om invers van een matrix in Numpy te berekenen, zeg Matrix M, het zou eenvoudig moeten zijn:
print M.I

Hier is de code:

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

Ik vervolg, deze fout treedt op omdat X nu plat is, dus ‘I‘ is niet compatibel. Is er hiervoor een werk?

Mijn doel is om de inverse matrix van elke mogelijke numerieke matrixcombinatie af te drukken.


Antwoord 1, Autoriteit 100%

De Ikenmerk bestaat alleen op matrixObjecten, niet ndarrayS. U kunt numpy.linalg.invom arrays om te weren:

inverse = numpy.linalg.inv(x)

Merk op dat de manier waarop je matrices genereert, niet allemaal inverteerbaar zullen zijn. Je hoeft ofwel de manier waarop je matrices genereert, of degenen die die niet inverteerbaar zijn.

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

Ook, als u alle 3×3-matrices wilt doorlopen met elementen die zijn getrokken uit [0, 10), wilt u het volgende:

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

in plaats van combinations_with_replacement, of u slaat matrices op als

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

Antwoord 2, Autoriteit 19%

Nog een manier om dit te doen is om de matrixKlasse (in plaats van een numpy array) en de Iattribuut. Bijvoorbeeld:

>>> m = np.matrix([[2,3],[4,5]])
>>> m.I
matrix([[-2.5,  1.5],
       [ 2. , -1. ]])

Antwoord 3, Autoriteit 13%

Inverse of a Matrix met Python en Numpy:

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

Niet alle matrices kunnen worden omgekeerd. Bijvoorbeeld singuliere matrices zijn niet inverteerbaar :

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

oplossing voor enkelvoudig matrixprobleem:

Probeer de unieke matrix-uitzondering op en blijf doorgaan totdat u een transformatie vindt die voldoet aan uw eerdere criteria en ook inverteerbaar is.

Intuïtie waarom matrixinversie niet altijd mogelijk is; zoals in singuliere matrices:

Stel je een oude overhead-filmprojector voor die een helder licht door film heen op een witte muur schijnt. De pixels in de film worden geprojecteerd op de pixels op de muur.

Als ik de filmprojectie op een enkel frame stop, zie je de pixels van de film aan de muur en vraag ik je om de film te regenereren op basis van wat je ziet. Dat is makkelijk, zeg je, neem gewoon de inverse van de matrix die de projectie uitvoerde. Een inverse van een matrix is de omkering van de projectie.

Stel je nu eens voor dat de projector beschadigd was en ik een vervormde lens voor de film plaatste. Nu worden meerdere pixels op dezelfde plek op de muur geprojecteerd. Ik vroeg je opnieuw om “deze bewerking met de matrix inverse ongedaan te maken”. Je zegt: “Dat kan ik niet omdat je informatie hebt vernietigd met de lensvervorming, ik kan niet terug naar waar we waren, omdat de matrix ofwel enkelvoudig of gedegenereerd is.”

Een matrix die kan worden gebruikt om bepaalde gegevens in andere gegevens om te zetten, is alleen omkeerbaar als het proces kan worden omgekeerd zonder verlies van informatie. Als uw matrix niet kan worden omgekeerd, definieert u misschien uw projectie met behulp van een gok-en-check-methode in plaats van een proces te gebruiken dat een niet-corrupte transformatie garandeert.

Als je een heuristiek of iets minder dan perfecte wiskundige precisie gebruikt, moet je een ander proces definiëren om vervormingen te beheren en in quarantaine te plaatsen, zodat het programmeren met Brownse beweging kan worden hervat.

Bron:

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


Antwoord 4, autoriteit 2%

Hoe zit het met inv?

bijvoorbeeld:
my_inverse_array = inv(my_array)

Other episodes