2014-09-05 77 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