2017-11-22 7 views
-2

アレイ(15):numpyののargsort挙動

a = np.array([5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]) 
np.argsort(a) 

出力= [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]


奇数長の

アレイ(17):

a = np.array([5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]) 
np.argsort(a) 

出力= [0 14 13 12 11 10 9 15 8 6 5 4 3 2 1 7 16]


奇数の長さ(35)の配列:

a = np.array([5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]) 
np.argsort(a) 

出力= [0 19 20 21 22 23 24 18 25 27 28 29 30 31 32 26 33 17 15 1 2 3 4 5 6 16 7 9 10 11 12 13 14 8 34]



ARR AYも長さ(16)の:

a = np.array([5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]) 
    np.argsort(a) 

出力= [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]


も長さの配列(18 ):

a = np.array([5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]) 
print len(a) 

出力= [0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 16 17]

偶数長の

アレイ(36):

a = np.array([5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]) 
np.argsort(a) 

出力= [0 20 21 22 23 24 25 19 26 28 29 30 31 32 33 27 18 17 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 34 35]

誰かがこのアルゴリズムが等しい数の場合にどのように機能するか説明しますか?

+0

同じ数字の場合、ランダムに 'kind = 'mergesort''を使用します。 – Divakar

+0

私はそれを何度もやっていて、同じ数字が出てきます。 –

+0

私はそれを見つけるために 'quicksort'の実装を詳しく調べる必要があると思います。 – Divakar

答えて

1

argsort()は、設定可能ソートアルゴリズムを使用します。 quicksort,mergesortまたはheapsortの中から選択することができます。 argsort documentationから:

numpy.argsort(a, axis=-1, kind='quicksort', order=None)

[...]

種類:アルゴリズムをソート{「クイックソート」、「マージ」、「ヒープソート」}、任意

デフォルトはquicksortで、ウィキペディアは述べているとおり、効率的な実装では

それは同じソート項目の相対的な順序は保存されないことを意味し、安定ソートではありません。

Numpyの実装は効率的であり、等しい値の相対的な順序は保持されません。

あなたが安定したソートが必要な場合は、代わりにmergesortを使用します。

>>> a = np.array([5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]) 
>>> np.argsort(a, kind='mergesort') 
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 
     34]) 

Heapsortはどちらか安定していません。