2012-06-28 10 views
5

argsort()関数は、結果がsort()の結果と一致するように元の配列のインデックスに使用できるインデックスの行列を返します。numpy:配列にargsortを適用する

これらのインデックスを適用する方法はありますか?私は2つの配列を持って、1つは並べ替え順序を取得するために使用される配列であり、もう1つは関連付けられたデータです。

私はassoc_data[array1.argsort()]を計算したいと思いますが、うまくいかないようです。私は(または他の関連するデータを持つ配列)が、私はそうするかどうかはわかりませんZ2に適用したい

z=array([1,2,3,4,5,6,7]) 
z2=array([z,z*z-7]) 
i=z2.argsort() 

z2=array([[ 1, 2, 3, 4, 5, 6, 7], 
      [-6, -3, 2, 9, 18, 29, 42]]) 
i =array([[1, 1, 1, 0, 0, 0, 0], 
      [0, 0, 0, 1, 1, 1, 1]]) 

は、ここでの例です。

+0

どの軸を並べ替えたいですか? – user545424

答えて

7

は、これはおそらく過剰ですが、これは番目のケースで動作します:あなたは、私はちょうどnumpyologyの私の修士の学位を得た幸運

import numpy as np 
axis = 0 
index = list(np.ix_(*[np.arange(i) for i in z2.shape])) 
index[axis] = z2.argsort(axis) 
z2[index] 

# Or if you only need the 3d case you can use np.ogrid. 

axis = 0 
index = np.ogrid[:z2.shape[0], :z2.shape[1], :z2.shape[2]] 
index[axis] = z2.argsort(axis) 
z2[index] 
+4

奇妙なことに、私はちょうど1年後にこれをもう一度必要としました。そして、それをやり遂げる方法を探して、前に尋ねた質問を走りました。それは、過剰な、btwのように見えません。 –

0

ああ、考え出しました。

In [274]: z2[i,range(z2.shape[1])] 
Out[274]: 
array([[-6, -3, 2, 4, 5, 6, 7], 
     [ 1, 2, 3, 9, 18, 29, 42]]) 
+1

Argh - これは2D用であり、3D用ではありません。一息。 –

+0

プラス私は何を言っていない;) – tiho

+0

ええええええ、私は '私は'と言った;質問を読んでください。 –

4

>>> def apply_argsort(a, axis=-1): 
...  i = list(np.ogrid[[slice(x) for x in a.shape]]) 
...  i[axis] = a.argsort(axis) 
...  return a[i] 
... 
>>> a = np.array([[1,2,3,4,5,6,7],[-6,-3,2,9,18,29,42]]) 
>>> apply_argsort(a,0) 
array([[-6, -3, 2, 4, 5, 6, 7], 
     [ 1, 2, 3, 9, 18, 29, 42]]) 

何が起こっているのかについては、this questionの回答を参照してください。

関連する問題