ソリューション...インデックスが適切に機能する浮気されています
>>> a[np.arange(np.shape(a)[0])[:,np.newaxis], np.argsort(a)]
array([[1, 2, 3],
[2, 8, 9]])
をあなたは右のそれを得た、私はインデックスを不正行為としてそれを説明しないでしょうけれども。
多分これはそれをより明確にするのに役立ちます。
In [544]: i=np.argsort(a,axis=1)
In [545]: i
Out[545]:
array([[1, 2, 0],
[2, 0, 1]])
i
は、各行のための私たちが望むことの順序、です。つまり、
In [546]: a[0, i[0,:]]
Out[546]: array([1, 2, 3])
In [547]: a[1, i[1,:]]
Out[547]: array([2, 8, 9])
両方のインデックス作成手順を一度に行うには、第1次元に「列」インデックスを使用する必要があります。
In [548]: a[[[0],[1]],i]
Out[548]:
array([[1, 2, 3],
[2, 8, 9]])
i
と対にすることができる他の配列は次のとおり
In [560]: j=np.array([[0,0,0],[1,1,1]])
In [561]: j
Out[561]:
array([[0, 0, 0],
[1, 1, 1]])
In [562]: a[j,i]
Out[562]:
array([[1, 2, 3],
[2, 8, 9]])
i
各要素の列を識別した場合、その後j
各要素の行を指定します。 [[0],[1]]
列配列は、i
に対してブロードキャストできるので、同様に機能します。
私はj
のための '短い手' として
np.array([[0],
[1]])
を考えます。それらは一緒に、新しい配列の各要素のソース行と列を定義します。彼らは一緒に、逐次ではなく動作します。
新しい配列へa
からの完全なマッピングは次のとおりです。
[a[0,1] a[0,2] a[0,0]
a[1,2] a[1,0] a[1,1]]
def foo(a):
i = np.argsort(a, axis=1)
return (np.arange(a.shape[0])[:,None], i)
In [61]: foo(a)
Out[61]:
(array([[0],
[1]]), array([[1, 2, 0],
[2, 0, 1]], dtype=int32))
In [62]: a[foo(a)]
Out[62]:
array([[1, 2, 3],
[2, 8, 9]])
本当に有益な説明です。秒がある場合は、1次元の列インデックス[ing]について説明できますか?それは配列を(2,1,3)右に変換しているだけです...なぜそれがスライスを容易にしますか? – DilithiumMatrix
私は説明を拡張しました。 – hpaulj
これを行う簡単な方法はありますか?私はargsortが配列をソートした後にどのようなものが使用されるのかを考えなければならないと思っていましたか?..... – Martian2049