2016-12-22 15 views
3

OpenCVのメソッドを使用して得られた座標を含むnumpy配列を持っています。輪郭を描くためにそれらを並べ替える必要があります。第1列の値が同じ場合にのみ、第2列に従ってnumpy配列をソートします。

例未分類numpyのアレイ(不座標):期待

[[ 0, 2], 
    [ 0, 0], 
    [-1, 8], 
    [-6, 7], 
    [-1, 1]] 

はnumpyの配列をソート:

[[-6, 7], 
    [-1, 1], 
    [-1, 8], 
    [ 0, 0], 
    [ 0, 2]] 

Iが配列の最初の列に基づいてソートしたいと最初の列の値が等しい場合は、2番目の列に従ってソートする必要があります。処理がクラウド上で行われるため、時間の複雑さを最小限に抑えて処理する方法はありますか?

答えて

5

あなたがnp.lexsort使用することができます -

a[np.lexsort(a[:,::-1].T)] 

サンプル実行 -

In [42]: a 
Out[42]: 
array([[ 0, 2], 
     [ 0, 0], 
     [-1, 8], 
     [-6, 7], 
     [-1, 1]]) 

In [43]: a[np.lexsort(a[:,::-1].T)] 
Out[43]: 
array([[-6, 7], 
     [-1, 1], 
     [-1, 8], 
     [ 0, 0], 
     [ 0, 2]]) 
+0

すごいです!魅力的に働いた!ありがとうございました:Dまた、 'T 'が何であるか、または何かを教えてください。 PS。ソートされたリストの輪郭を描画する方法を提案できますか?通常のopencvメソッド 'drawContours()'の出力はすべて異常です。 – hulkinBrain

+1

@hulkinBrainこれは転置です。 'np.lexsort'は他のカラムに基づいて各カラムをソートしようとします。行をソートしようとしているので、その転置が必要です。 lexsortでは、一次ソート順が最後の要素になり、私たちの場合は各行の最初の要素になるので、フリッピングが必要です。 – Divakar

+0

@hulkinBrain私は、輪郭を各輪郭の '(Nx2)'形状の配列として取得し、開始時にゼロ配列として初期化されるイメージ配列に反復的に割り当てることを提案します。 – Divakar

関連する問題