8

対角線上にあるはずの行列がありますが、列が混同されています。

めちゃくちゃなマトリックス

しかし、明らかな for ループがなければ、行を効率的に交換して対角線を統一する方法がわかりません。並べ替えるためにどのキーを渡すかさえわかりません。

助言がありますか?

4

2 に答える 2

7

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.  ]])
于 2012-08-22T02:56:00.333 に答える
3
>>> 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ます。

于 2012-08-22T02:47:59.667 に答える