web-dev-qa-db-ja.com

numpyを使用した行列の逆

Numpyを使用して逆数を計算したいと思います。しかし、私はエラーが発生しています:

'numpy.ndarry' object has no attribute I

Numpyの行列の逆行列、たとえば行列Mを計算するには、単純にprint M.Iである必要があります

コードは次のとおりです。

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

私は推測していますが、このエラーはxがフラットになったために発生するため、「I」コマンドには互換性がありません。これに対する回避策はありますか?

私の目標は、可能なすべての数値行列の組み合わせの逆行列を印刷することです。

45
Jake Z

I属性は、matrixオブジェクトではなく、ndarrayオブジェクトにのみ存在します。 numpy.linalg.inv を使用して配列を反転できます。

inverse = numpy.linalg.inv(x)

マトリックスの生成方法に注意してください。すべてのマトリックスが可逆的ではありません。マトリックスの生成方法を変更するか、反転できないマトリックスをスキップする必要があります。

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

また、[0、10)から引き出された要素を持つすべての3x3行列を調べたい場合は、次のものが必要です。

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

combinations_with_replacementではなく、または次のような行列をスキップします

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

これを行う別の方法は、 numpy matrix class (numpy配列ではなく)とI属性を使用することです。例えば:

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

pythonとnumpy:を使用した逆行列

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

すべてのマトリックスを反転できるわけではありません。たとえば、 特異行列は反転不可

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

LinAlgError: Singular matrix

特異行列問題の解法:

singular Matrix例外をキャッチして、以前の条件に一致し、かつ反転可能でもある変換が見つかるまで続けます。

マトリックスの反転が常に行われない理由の直観;特異行列のように:

フィルムを通して白い壁に明るい光を当てる古いオーバーヘッドフィルムプロジェクターを想像してください。フィルムのピクセルは、壁のピクセルに投影されます。

フィルムの投影を1つのフレームで停止すると、壁にフィルムのピクセルが表示されます。表示内容に基づいてフィルムを再生成するようにお願いします。それは簡単です、あなたが言うように、単に投影を実行したマトリックスの逆を取ります。マトリックスの逆は、投影の反転です。

プロジェクターが破損していて、フィルムの前に歪んだレンズを置いた場合を想像してください。これで、複数のピクセルが壁の同じ場所に投影されます。 「マトリックス逆行列を使用してこの操作を元に戻す」ようにもう一度お願いしました。あなたは言う:「あなたはレンズの歪みで情報を破壊したので、私はできなかった。マトリックスが特異または退化のいずれかであるので、私たちがいた場所に戻ることができない。」

一部のデータを他のデータに変換するために使用できるマトリックスは、情報を失うことなくプロセスを元に戻すことができる場合にのみ反転できます。マトリックスを反転できない場合、破損していない変換を保証するプロセスを使用するのではなく、推測とチェックの方法を使用して投影を定義している可能性があります。

ヒューリスティックまたは完全な数学的精度よりも低いものを使用している場合、歪みを管理および隔離する別のプロセスを定義して、ブラウン運動によるプログラミングを再開する必要があります。

ソース:

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

8
Eric Leschinski

inv についてはどうですか?

例:my_inverse_array = inv(my_array)

2
user1330052