2

n x 2の整数行列があります。最初の列は系列 0,1,-1,2,-2 ですが、これらは構成行列からコンパイルされた順序になっています。2 番目の列は、別のリストからのインデックスのリストです。

この 2 番目の列で行列を並べ替えたいと思います。これは、Excel で 2 列のデータを選択し、列 B (データが列 A と列 B にある場合) を介して並べ替えることに相当します。各行の最初の列の隣接するデータは、対応する 2 番目の列と一緒に保持する必要があることに注意してください。私は以下を使用して解決策を見てきました:

data[np.argsort(data[:, 0])]

しかし、これはうまくいかないようです。問題のマトリックスは次のようになります。

matrix([[1, 1],
        [1, 3],
        [1, 7],
        ..., 
        [2, 1021],
        [2, 1040],
        [2, 1052]])
4

2 に答える 2

3

np.lexsortを使用できます:

numpy.lexsort(keys、axis = -1)

キーのシーケンスを使用して間接ソートを実行します。

スプレッドシートの列として解釈できる複数の並べ替えキーを指定すると、lexsortは、複数の列による並べ替え順序を説明する整数インデックスの配列を返します。


In [13]: data = np.matrix(np.arange(10)[::-1].reshape(-1,2))

In [14]: data
Out[14]: 
matrix([[9, 8],
        [7, 6],
        [5, 4],
        [3, 2],
        [1, 0]])

In [15]: temp = data.view(np.ndarray)

In [16]: np.lexsort((temp[:, 1], ))
Out[16]: array([4, 3, 2, 1, 0])

In [17]: temp[np.lexsort((temp[:, 1], ))]
Out[17]: 
array([[1, 0],
       [3, 2],
       [5, 4],
       [7, 6],
       [9, 8]])

に複数のキーを渡す場合はnp.lexsort最後のキーが主キーであることに注意してください。最後から2番目のキーは2番目のキーであり、以下同様です。


上で示したように使用するには、 numpy行列では機能しないnp.lexsortため、一時配列を使用する必要があります。のコピーではなくビューを作成するnp.lexsortため 、余分なメモリはあまり必要ありません。でも、temp = data.view(np.ndarray)data

temp[np.lexsort((temp[:, 1], ))]

は新しいアレイであり、より多くのメモリを必要とします。

その場で列で並べ替える方法もあります。アイデアは、配列を2列の構造化配列として表示することです。プレーンなndarrayとは異なり、構造化配列には、sort列をキーとして指定できるメソッドがあります。

In [65]: data.dtype
Out[65]: dtype('int32')

In [66]: temp2 = data.ravel().view('int32, int32')

In [67]: temp2.sort(order = ['f1', 'f0'])

temp2はのビューであるdataため、新しいメモリを割り当てたり、配列をコピーしたりする必要がないことに注意してください。また、並べ替えは同時にtemp2変更されます。data

In [69]: data
Out[69]: 
matrix([[1, 0],
        [3, 2],
        [5, 4],
        [7, 6],
        [9, 8]])
于 2012-11-12T04:01:31.767 に答える
1

あなたは正しい考えを持っていましたが、数文字離れています。

>>> import numpy as np
>>> data = np.matrix([[9, 8],
...                   [7, 6],
...                   [5, 4],
...                   [3, 2],
...                   [1, 0]])
>>> data[np.argsort(data.A[:, 1])]
matrix([[1, 0],
        [3, 2],
        [5, 4],
        [7, 6],
        [9, 8]])
于 2012-11-12T16:22:13.390 に答える