この配列に加えられた変更を追跡できるだけでなく、2D numpy 配列に繰り返し変更を加えるための最も効率的な (読み取り: 最も速い) 方法に頭を悩ませています。
私の特定の問題では、次のように 2D 配列の要素を変更しようとしています。
import numpy as np
a1 = np.array([ [2, 1, 4, 2],
[1, 2, 3, 3],
[1, 2, 1, 1],
[2, 3, 5, 6]
])
new_arrays1 = []
for i in range(0, a1.shape[0]):
for j in range(0, a1.shape[1] - 1):
a1_move = np.copy(a1)
a1_move[i, j], a1_move[i, j + 1] = a1_move[i, j + 1], a1_move[i, j]
new_arrays1.append(a1_move)
new_arrays2 = []
for a2 in new_arrays1:
for i in range(0, a2.shape[0]):
for j in range(0, a2.shape[1] - 1):
a2_move = np.copy(a2)
a2_move[i, j], a2_move[i, j + 1] = a2_move[i, j + 1], a2_move[i, j]
new_arrays2.append(a2_move)
つまり、2D 配列の各行で可能なすべての要素をa11 つずつ移動し、12 (4x4) の新しい配列を作成します。次に、新しい 12 個の各配列の各行にあるすべての可能な要素を移動して、合計で 12x12 = 144 個の新しい配列を作成します。
ここでの私の質問は次のとおりです。最終的な 144 個の配列に到達するためにどのような手順 (配列の移動) を行ったかを知ることができるデータ構造/手法/何かはありますか? new_arrays[0]上記の例では、マトリックスがすべてのマトリックスにつながることを理解していnew_arrays2[0:11]ます。ただし、配列に到達するために取られた動きも知りたいnew_arrays2[0:11]です。
私の完全なコードでは、最初の配列 ( a1) は 12x6 です。さらに、行列に対してこれらの操作を 2 回以上実行する必要があり、おそらく合計で 4 ~ 5 回 (つまり、分析する行列の合計が 60^4 または 60^5)、これを解決するには効率的なソリューションが必要です。 .
私の最終目標は、最後のステップ (上記の例のステップ 2) ですべての配列を分析し、どの配列が「最適」であるかを推測し、最初の配列に対して行われた動きを使用して、この「最適な」配列に到達することです。私のコードで。