9

NumPy配列の一意のエントリを取得するこのトリックに続いて、基本的に[0.9:0.02:1.1]の範囲の最初の要素と[1.5:0.1:2.0]の範囲の2番目の要素を持つペアの2列の配列ができました。 ]。これを呼びましょうA。現在、完全に分類されていません。

In [111]: A
Out[111]: 
array([[ 1.1 ,  1.9 ],
       [ 1.06,  1.9 ],
       [ 1.08,  1.9 ],
       [ 1.08,  1.6 ],
       [ 0.9 ,  1.8 ],
       ...
       [ 1.04,  1.6 ],
       [ 0.96,  2.  ],
       [ 0.94,  2.  ],
       [ 0.98,  1.9 ]])

各行が最初に2番目の列で増加し、次に最初の列で増加するように並べ替えたいと思います。すなわち

array([[ 0.9 ,  1.5 ],
       [ 0.9 ,  1.6 ],
       [ 0.9 ,  1.7 ],
       [ 0.9 ,  1.9 ],
       [ 0.9 ,  1.9 ],
       [ 0.9 ,  2.  ],
       [ 0.92,  1.5 ],
       ...
       [ 1.08,  2.  ],
       [ 1.1 ,  1.5 ],
       [ 1.1 ,  1.6 ],
       [ 1.1 ,  1.7 ],
       [ 1.1 ,  1.8 ],
       [ 1.1 ,  1.9 ],
       [ 1.1 ,  2.  ]])

しかし、両方を提供するソートアルゴリズムが見つかりません。ここで提案されているように、私はA[A[:,0].argsort()]andを試しましA[A[:,1].argsort()]たが、それぞれ1つの列しかソートしていません。私も両方を適用しようとしましたが、同じことが起こります。

簡単なことを見逃してしまったことをお詫びしますが、しばらくの間これを探していました...

4

3 に答える 3

7

numpy.lexsortここで動作します:

A[np.lexsort(A.T)]

Alexsort に渡す前に転置する必要があります。これは、2 次元配列を渡すと、行 (最後の行、最後から 2 番目の行など) で並べ替えることが期待されるためです。

別のおそらくもう少し明確な方法は、列を明示的に渡すことです。

A[np.lexsort((A[:, 0], A[:, 1]))]

lexsort は最初に最後のキーでソートすることを覚えておく必要があります (これにはおそらく何らかの正当な理由があります。これは、連続するキーで安定したソートを実行するのと同じです)。

于 2012-09-19T14:13:12.180 に答える
4

以下はうまくいきますが、より速い方法があるかもしれません:

A = np.array(sorted(A,key=tuple))
于 2012-09-19T14:13:37.250 に答える
3

A2Dであるため、全体 (一意の部分を含む) を置き換えるだけです。

A = np.ascontiguousarray(A) # just to make sure...
A = A.view([('', A.dtype)] * A.shape[1])

A = np.unique(A)
# And if you want the old view:
A = A.view(A.dtype[0]).reshape(-1,len(A.dtype))

set速度をあまり気にしない限り、リンクされた質問の解決策を使用していないことを願っています。などはlexsort一般的に優れていますが、デフォルトの並べ替えが行われるため(再配列の場合)、ここでは必要ありません


編集:別のビュー(ほとんど同じ結果)ですが、形状を変更する必要がないため、もう少しエレガントです:

A = A.view([('', A.dtype, A.shape[0])])
A = np.unique(A)
# And to go back
A = A.view(A.dtype[0].base)
于 2012-09-19T14:28:31.950 に答える