考虑以下代码:
avgDists = np.array([1, 8, 6, 9, 4])
ids = avgDists.argsort()[:n]
这给了我n
最小元素的索引。是否可以按降序使用相同的argsort
来获得n
最高元素的索引?
发布于 2013-05-11 00:00:21
就像Python一样,[::-1]
颠倒了argsort()
返回的数组,[:n]
给出了最后n个元素:
>>> avgDists=np.array([1, 8, 6, 9, 4])
>>> n=3
>>> ids = avgDists.argsort()[::-1][:n]
>>> ids
array([3, 1, 2])
这种方法的优点是ids
是avgDists的view:
>>> ids.flags
C_CONTIGUOUS : False
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
( 'OWNDATA‘为False表示这是一个视图,而不是副本)
另一种方法类似于:
(-avgDists).argsort()[:n]
问题是,它的工作方式是创建数组中每个元素的负值:
>>> (-avgDists)
array([-1, -8, -6, -9, -4])
为此,ANd会创建一个副本:
>>> (-avgDists_n).flags['OWNDATA']
True
因此,如果你用这个非常小的数据集对每个数据集进行计时:
>>> import timeit
>>> timeit.timeit('(-avgDists).argsort()[:3]', setup="from __main__ import avgDists")
4.2879798610229045
>>> timeit.timeit('avgDists.argsort()[::-1][:3]', setup="from __main__ import avgDists")
2.8372560259886086
view方法的速度要快得多(并且使用了1/2的内存...)
发布于 2017-01-19 10:40:26
如果您只需要最低/最高n个元素的索引,则可以使用np.argpartition
,而不是使用np.argsort
。
这不需要对整个数组进行排序,但只需要对需要的部分进行排序,但请注意,“分区内的顺序”是未定义的,因此,尽管它给出了正确的索引,但它们可能没有正确排序:
>>> avgDists = [1, 8, 6, 9, 4]
>>> np.array(avgDists).argpartition(2)[:2] # indices of lowest 2 items
array([0, 4], dtype=int64)
>>> np.array(avgDists).argpartition(-2)[-2:] # indices of highest 2 items
array([1, 3], dtype=int64)
发布于 2017-02-24 09:25:35
在使用argsort
命令进行排序后,您可以使用numpy.flipud()
或numpy.fliplr()
命令以降序获得索引。这是我通常做的事情。
https://stackoverflow.com/questions/16486252
复制相似问题