ti-enxame.com

Inverso de uma matriz usando numpy

Eu gostaria de usar numpy para calcular o inverso. Mas estou recebendo um erro:

'numpy.ndarry' object has no attribute I

Para calcular o inverso de uma matriz em numpy, digamos matriz M, deve ser simplesmente: print M.I

Aqui está o código:

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

Estou presumindo que esse erro ocorra porque x agora está plano, portanto, o comando 'I' não é compatível. Existe uma solução alternativa para isso?

Meu objetivo é imprimir a MATRIZ INVERSA de todas as combinações possíveis de matriz numérica.

45
Jake Z

O atributo I existe apenas em objetos matrix, não em ndarrays. Você pode usar numpy.linalg.inv para inverter matrizes:

_inverse = numpy.linalg.inv(x)
_

Observe que, da maneira como você está gerando matrizes, nem todas elas serão invertíveis. Você precisará alterar a maneira como está gerando matrizes ou pular as que não são invertíveis.

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

Além disso, se você quiser passar por todas as matrizes 3x3 com elementos extraídos de [0, 10), deseja o seguinte:

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

em vez de _combinations_with_replacement_, ou você pulará matrizes como

_numpy.array([[0, 1, 0],
             [0, 0, 0],
             [0, 0, 0]])
_
57
user2357112

Outra maneira de fazer isso é usar o numpy matrix class (em vez de uma matriz numpy) e o atributo I. Por exemplo:

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

Inverso de uma matriz usando python e numpy:

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

Nem todas as matrizes podem ser invertidas. Por exemplo matrizes singulares não são invertíveis :

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

LinAlgError: Singular matrix

Solução para o problema da matriz singular:

tente capturar a exceção Matriz Singular e continue até encontrar uma transformação que atenda aos seus critérios anteriores E também seja invertível.

Intuição sobre por que a inversão da matriz nem sempre pode ser feita; como em matrizes singulares:

Imagine um projetor de filme antigo que ilumina uma luz brilhante através do filme em uma parede branca. Os pixels do filme são projetados para os pixels na parede.

Se eu interromper a projeção do filme em um único quadro, você verá os pixels do filme na parede e peço que você gere novamente o filme com base no que vê. É fácil, você diz, apenas pegar o inverso da matriz que executou a projeção. Um inverso de uma matriz é a reversão da projeção.

Agora imagine se o projetor estava corrompido e eu coloquei uma lente distorcida na frente do filme. Agora, vários pixels são projetados no mesmo local na parede. Pedi novamente para "desfazer esta operação com a matriz inversa". Você diz: "Não posso porque você destruiu as informações com a distorção da lente, não posso voltar para onde estávamos, porque a matriz é singular ou degenerada".

Uma matriz que pode ser usada para transformar alguns dados em outros dados é invertível apenas se o processo puder ser revertido sem perda de informações. Se sua matriz não puder ser invertida, talvez você esteja definindo sua projeção usando uma metodologia de adivinhação e verificação, em vez de usar um processo que garanta uma transformação não corrompida.

Se você estiver usando uma heurística ou algo menos do que precisão matemática perfeita, precisará definir outro processo para gerenciar e colocar em quarentena as distorções, para que a programação pelo movimento browniano possa ser retomada.

Fonte:

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

8
Eric Leschinski

E quanto a inv ?

por exemplo: minha_inverse_array = inv (minha_array)

2
user1330052