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
」コマンドには互換性がありません。これに対する回避策はありますか?
私の目標は、可能なすべての数値行列の組み合わせの逆行列を印刷することです。
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]])
これを行う別の方法は、 numpy matrix
class (numpy配列ではなく)とI
属性を使用することです。例えば:
>>> m = np.matrix([[2,3],[4,5]])
>>> m.I
matrix([[-2.5, 1.5],
[ 2. , -1. ]])
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
inv についてはどうですか?
例:my_inverse_array = inv(my_array)