首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以按降序使用argsort吗?

可以按降序使用argsort吗?
EN

Stack Overflow用户
提问于 2013-05-10 23:57:47
回答 8查看 246.2K关注 0票数 216

考虑以下代码:

代码语言:javascript
复制
avgDists = np.array([1, 8, 6, 9, 4])
ids = avgDists.argsort()[:n]

这给了我n最小元素的索引。是否可以按降序使用相同的argsort来获得n最高元素的索引?

EN

回答 8

Stack Overflow用户

发布于 2013-05-11 00:00:21

就像Python一样,[::-1]颠倒了argsort()返回的数组,[:n]给出了最后n个元素:

代码语言:javascript
复制
>>> avgDists=np.array([1, 8, 6, 9, 4])
>>> n=3
>>> ids = avgDists.argsort()[::-1][:n]
>>> ids
array([3, 1, 2])

这种方法的优点是ids是avgDists的view

代码语言:javascript
复制
>>> ids.flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

( 'OWNDATA‘为False表示这是一个视图,而不是副本)

另一种方法类似于:

代码语言:javascript
复制
(-avgDists).argsort()[:n]

问题是,它的工作方式是创建数组中每个元素的负值:

代码语言:javascript
复制
>>> (-avgDists)
array([-1, -8, -6, -9, -4])

为此,ANd会创建一个副本:

代码语言:javascript
复制
>>> (-avgDists_n).flags['OWNDATA']
True

因此,如果你用这个非常小的数据集对每个数据集进行计时:

代码语言:javascript
复制
>>> 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的内存...)

票数 86
EN

Stack Overflow用户

发布于 2017-01-19 10:40:26

如果您只需要最低/最高n个元素的索引,则可以使用np.argpartition,而不是使用np.argsort

这不需要对整个数组进行排序,但只需要对需要的部分进行排序,但请注意,“分区内的顺序”是未定义的,因此,尽管它给出了正确的索引,但它们可能没有正确排序:

代码语言:javascript
复制
>>> 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)
票数 8
EN

Stack Overflow用户

发布于 2017-02-24 09:25:35

在使用argsort命令进行排序后,您可以使用numpy.flipud()numpy.fliplr()命令以降序获得索引。这是我通常做的事情。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16486252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档