Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy 1.6.1 argsort()奇怪的行为?_Python_Arrays_Sorting_Numpy - Fatal编程技术网

Python numpy 1.6.1 argsort()奇怪的行为?

Python numpy 1.6.1 argsort()奇怪的行为?,python,arrays,sorting,numpy,Python,Arrays,Sorting,Numpy,我有一个数组数据,它的形状是N,6。我将按最后一列对该数组进行排序,以便: sortx = numpy.argsort( data[:,-1] )[::-1] sortedData = data[ sortx, : ] 其中,[::-1]用于将列从高到低排序,而不是从低到高,数据为float64。然后,我将此排序数组保存到.npy文件中,如下所示: numpy.save( 'file.npy', sortedData ) 但是,当我再次加载数组并检查数据的排序时,它似乎不符合顺序!奇怪的只是

我有一个数组数据,它的形状是N,6。我将按最后一列对该数组进行排序,以便:

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) )
如果将r和order与numpy.sum order==r进行比较,您会发现这并不等于N。大约2%的顺序不相同

首先,我是否正确理解上述代码?第二,有人能复制这个吗?我在Linux上使用Python 2.7.2和numpy 1.6.1


更新:即使在第一次排序之后和保存之前,也会发生此行为。所以这和排序本身有关。排序列中有重复值。

如果最后一列有重复值,我可以重现症状:

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使用快速排序。快速排序不稳定,因此绑定行的顺序不一定与原始数据的顺序相同

但是,即使要使用稳定的排序(如mergesort),当您反转np.argsort的结果时,对于绑定的行,较高的索引将首先出现

因此,当您第二次调用np.argsort时,不会得到等于r的顺序

您可以通过对最后一列进行排序并使用np.arangelendata,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.arangelendata,0,-1将较高的索引放在绑定行的第一位,因此当您尊重索引时,较低的索引是第一位的。

您可以做很多事情来隔离问题;例如,在没有中间保存的情况下是否也会发生这种情况?数据的数据类型是什么?它们可能是看起来像数字的字符串吗?如果你发布一段重现问题的数据,这将对我们有很大帮助。谢谢它在没有保存的情况下发生。数据类型为float64。数据[:,-1]中是否有NaN值?您可以使用np.isnandata[:,-1]进行检查。任意。最后一列中是否有相等的值?在最后一列中,是否有看起来不符合顺序、共享相同值的行?我明白了!谢谢你用通俗易懂的语言把它拼出来。干杯