7

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

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

計算したいのassoc_data[array1.argsort()]ですが、うまくいきません。

次に例を示します。

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]])

i を z2 (または関連付けられたデータを持つ別の配列) に適用したいのですが、その方法がわかりません。

4

4 に答える 4

10

これはおそらくやり過ぎですが、これは次の場合に機能します。

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]
于 2012-06-28T22:42:49.483 に答える
5

あなたは幸運です、私はnumpyologyの修士号を取得したばかりです.

>>> 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]])

何が起こっているのかについては、この質問に対する私の回答を参照してください。

于 2012-06-28T23:56:52.930 に答える
2

使用するnp.take_along_axis

np.take_along_axis(z2, i, axis=1)
Out[31]: 
array([[ 1,  2,  3,  4,  5,  6,  7],
       [-6, -3,  2,  9, 18, 29, 42]])
于 2019-02-19T14:06:39.320 に答える
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]])
于 2012-06-28T22:04:30.977 に答える