は容易である:元の対角線に、各行の要素を再配置
In [192]: A=np.array([[5,7,8],[7,2,9],[8,9,3]])
In [193]: A
Out[193]:
array([[5, 7, 8],
[7, 2, 9],
[8, 9, 3]])
In [194]: np.diag(A)
Out[194]: array([5, 2, 3])
In [195]: idx=np.argsort(np.diag(A))
In [196]: idx
Out[196]: array([1, 2, 0], dtype=int32)
In [197]: A[idx,:]
Out[197]:
array([[7, 2, 9],
[8, 9, 3],
[5, 7, 8]])
は対角線上に戻っていくつかの実験を取る - 試行錯誤。 idx
の並べ替えに関連する値に基づいて、各行を「ロール」させる必要があります。私は別々に各行をロールする機能があるかどうか、またはそれを行うために行を繰り返す必要があるかどうかは思い出せません。
In [218]: A1=A[idx,:]
In [219]: [np.roll(a,-i) for a,i in zip(A1,[1,1,1])]
Out[219]: [array([2, 9, 7]), array([9, 3, 8]), array([7, 8, 5])]
In [220]: np.array([np.roll(a,-i) for a,i in zip(A1,[1,1,1])])
Out[220]:
array([[2, 9, 7],
[9, 3, 8],
[7, 8, 5]])
だから、ロールで[1,1,1]
を実行します。しかし、私はそれをどのように導き出すことができないのか分かりません。私はいくつかのより多くのテストケースを生成する必要があると思われます。より大きなテストケースを作成し、パターンを探す必要があります。
このロールは、元の位置と新しい位置の差である行の移動量と関係している可能性があります。試してみましょう:行と列の両方に並べ替えidx
を適用
np.arange(3)-idx
In [222]: np.array([np.roll(a,i) for a,i in zip(A1,np.arange(3)-idx)])
Out[222]:
array([[2, 9, 7],
[9, 3, 8],
[7, 8, 5]])
は、同様にトリックを行うようだ:
In [227]: A[idx,:][:,idx]
Out[227]:
array([[2, 9, 7],
[9, 3, 8],
[7, 8, 5]])
In [229]: A[idx[:,None],idx]
Out[229]:
array([[2, 9, 7],
[9, 3, 8],
[7, 8, 5]])
を追加あなたはどのコードを試してみたのですか? – cctan
Python ofcourse、私は何をしましたか: (1)A = Cのdiagメンバーを取得してください (2)D =ソート済みCのインデックスを取得する(argsortを使用) 。D –