私はnumpyを使ってPythonリスト/マトリックスの '力'を得ようとしています。私の唯一の現在の作業ソリューションはnp.dotを使用して、反復の関数()である:Numpy 2D Array - Power Of - 答えを返さない?
def matr_power(matrix, power):
matrix_a = list(matrix)
matrix_b = list(matrix)
for i in range(0, power-1):
matrix_a = np.dot(matrix_a, matrix_b)
return matrix_a
このは私のニーズにを動作しますが、私はそれはおそらく最も効率的な方法ではありません注意してくださいね。
リストをnumpy配列に変換してパワー操作を実行してからリストに戻って、必要な形式で使用できるようにしました。変換は起きているように見えますが、力の計算はしません。
while (foo != bar):
matr_x = np.asarray(matr_a)
matr_y = matr_x ** n
matr_out = matr_y.tolist()
n += 1
# Other code here to output certain results
問題は、マトリックスは予想通りのアレイに変換される、であるが、電源動作を行う場合(**
)matr_y
には計算がこれまで行われなかったかのようにmatr_x
と同様になってしまいます。私はnp.power(matr_y, n)
とStack Overflowに関する関連する質問にある他の解決策を試してみました。
私はnumpyのドキュメントを使用しようとしましたが、誤解していますか、または、これが期待どおりに動作するはずです。
計算がmatr_x ** i
は決して計算されない(または他の場合はmatr_y
に保存されない)ことを除いて、PyCharmのデバッグコンソールをすべてチェックするとすべての行列/リスト/配列が変換されます。
回答
が**
オペレータとnumpyの行列を使用することは可能だが、最善の解決策は、(numpyの行列が廃止されたように)numpyののlinalgのmatrix_power法と組み合わせnumpyの配列を使用することです。
matr_x = np.array(mat_a)
matr_y = np.linalg.matrix_power(matr_x, path_length)
work_matr = matr_y.tolist()
要素単位であること**
の機能は、私は(唯一の0と1)を隣接行列を使用していなかった以前に発見された可能性があることを今も明らかです。
:だから合計で、あなたはコードで34
よりもはるかに良いだけで7回の乗算が必要です。 –
本当にありがとうございますが、power(matr_y、i)も期待通りに動作していないようです。これも要素的なのでしょうか? np.dot()で唯一のオプションを繰り返していますか? – Matchoo
はい、 'power'は、そのdocstringの最初の行で説明されているように、要素単位です。 :) –