2014-09-05 73 views
2

我有一個陣列data它有形狀(N,6)。我被最終列排序此陣列,使得:numpy 1.6.1 argsort()奇怪的行爲?

sortx = numpy.argsort(data[:,-1])[::-1] 
sortedData = data[ sortx, : ] 

其中[::-1]用於從高向低的列進行排序,而不是低到高,並且數據是float64。我那麼這個排序數組保存到一個文件.npy如下:

numpy.save('file.npy', sortedData) 

然而,當我再次加載陣列回來和檢查數據的排序,它不會出現在訂購!這只是一些行,並不是所有這些都很奇怪。

data_again = numpy.load('file.npy') 
order = numpy.argsort(data_again[:,-1])[::-1] 
r = numpy.arange(len(data_again)) 

如果你比較rordernumpy.sum(order == r),你看,這不等於N.在2%左右沒有以相同的順序!

首先,我是否正確理解上述代碼?其次,任何人都可以重現這一點嗎?我在Linux上使用Python 2.7.2,numpy 1.6.1。

更新:甚至在第一次排序和保存之前甚至會發生此行爲。所以這與排序本身有關。排序列中有重複的值。

+2

有很多你可以做的孤立問題;它是否發生沒有中間保存以及,例如? – 2014-09-05 12:53:41

+1

什麼是數據類型?他們也許看起來像數字的字符串?如果你發佈一些能夠再現問題的數據,它將對我們有很大的幫助。 – unutbu 2014-09-05 12:54:14

+0

嘿。謝謝。它確實發生沒有保存。 dtype是float64。 – 2014-09-05 12:59:38

回答

4

我可以重現症狀,如果最後一列已經重複值:

import numpy as np 
np.random.seed(0) 
data = np.random.random((8,2)) 
data[::2,-1] = data[1::2,-1] 
print(data) 
# [[ 0.5488135 0.54488318] 
# [ 0.60276338 0.54488318] 
# [ 0.4236548 0.891773 ] 
# [ 0.43758721 0.891773 ] 
# [ 0.96366276 0.52889492] 
# [ 0.79172504 0.52889492] 
# [ 0.56804456 0.0871293 ] 
# [ 0.07103606 0.0871293 ]] 
sortx = np.argsort(data[:,-1])[::-1] 
sorted_data = data[ sortx, : ] 

order = np.argsort(sorted_data[:,-1])[::-1] 
r = np.arange(len(sorted_data)) 
print(order) 
# [1 0 3 2 5 4 7 6] 
print(r) 
# [0 1 2 3 4 5 6 7] 
print(np.allclose(order, r)) 
# False 

np.argsort默認使用快速排序。 Quicksort不穩定,因此綁定行的順序不一定與原始數據的順序相同。

然而,即使你使用一個穩定的排序如mergesort,當你反向結果np.argsort,對於那些綁行,則更高指數是第一位的。

因此,當您第二次撥打np.argsort時,您不會收到order等於r

你可以通過排序的最後一列,並使用np.arange(len(data),0,-1)作爲決勝產生順序:

sortx = np.lexsort((np.arange(len(data),0,-1), data[:,-1]))[::-1] 
sorted_data = data[ sortx, : ] 

order = np.lexsort((np.arange(len(data),0,-1), sorted_data[:,-1]))[::-1] 
r = np.arange(len(sorted_data)) 
print(order) 
# [0 1 2 3 4 5 6 7] 
print(r) 
# [0 1 2 3 4 5 6 7] 
print(np.allclose(order, r)) 
# True 

使用np.arange(len(data),0,-1)地方較高的指數第一(用於綁行),這樣,當你尊指數,較低的指數是第一位的。

+0

我明白了!感謝您用簡單的語言拼寫出來。乾杯。 – 2014-09-05 13:38:19