対角線上にあるはずの行列がありますが、列が混同されています。
しかし、明らかな for ループがなければ、行を効率的に交換して対角線を統一する方法がわかりません。並べ替えるためにどのキーを渡すかさえわかりません。
助言がありますか?
numpy を使用argmax
して目標列の順序を決定し、argmax の結果を列インデックスとして使用して行列を並べ替えることができます。
>>> z = numpy.array([[ 0.1 , 0.1 , 1. ],
... [ 1. , 0.1 , 0.09],
... [ 0.1 , 1. , 0.2 ]])
numpy.argmax(z, axis=1)
>>> array([2, 0, 1]) #Goal column indices
z[:,numpy.argmax(z, axis=1)]
>>> array([[ 1. , 0.1 , 0.1 ],
... [ 0.09, 1. , 0.1 ],
... [ 0.2 , 0.1 , 1. ]])
>>> import numpy as np
>>> a = np.array([[ 1. , 0.5, 0.5, 0. ],
... [ 0.5, 0.5, 1. , 0. ],
... [ 0. , 1. , 0. , 0.5],
... [ 0. , 0.5, 0.5, 1. ]])
>>> np.array(sorted(a, cmp=lambda x, y: list(x).index(1) - list(y).index(1)))
array([[ 1. , 0.5, 0.5, 0. ],
[ 0. , 1. , 0. , 0.5],
[ 0.5, 0.5, 1. , 0. ],
[ 0. , 0.5, 0.5, 1. ]])
実際には、列ではなく行でソートされます (ただし、結果は同じです)。ある列のインデックスでソートすることで機能し1
ます。