首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Numpy argsort -它在做什么?

Numpy argsort -它在做什么?
EN

Stack Overflow用户
提问于 2013-07-28 02:44:56
回答 10查看 97.7K关注 0票数 151

为什么numpy会给出这样的结果:

代码语言:javascript
复制
x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()

>[2 3 1 0]

当我期望它这样做的时候:

3 2 0 1

显然,我对这个函数的理解还很欠缺。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2013-07-28 02:48:08

根据the documentation的说法

返回对数组进行排序的索引。

  • 20.0.
  • 3的索引,是0.1.
  • 1的索引,是1.41.
  • 0的索引,是1.48.

的索引

票数 161
EN

Stack Overflow用户

发布于 2013-07-28 02:47:53

[2, 3, 1, 0]表示最小的元素位于索引2处,其次是索引3处的最小元素,然后是索引1,最后是索引0。

有几个a number of ways可以得到你想要的结果:

代码语言:javascript
复制
import numpy as np
import scipy.stats as stats

def using_indexed_assignment(x):
    "https://stackoverflow.com/a/5284703/190597 (Sven Marnach)"
    result = np.empty(len(x), dtype=int)
    temp = x.argsort()
    result[temp] = np.arange(len(x))
    return result

def using_rankdata(x):
    return stats.rankdata(x)-1

def using_argsort_twice(x):
    "https://stackoverflow.com/a/6266510/190597 (k.rooijers)"
    return np.argsort(np.argsort(x))

def using_digitize(x):
    unique_vals, index = np.unique(x, return_inverse=True)
    return np.digitize(x, bins=unique_vals) - 1

例如,

代码语言:javascript
复制
In [72]: x = np.array([1.48,1.41,0.0,0.1])

In [73]: using_indexed_assignment(x)
Out[73]: array([3, 2, 0, 1])

这将检查它们是否都产生相同的结果:

代码语言:javascript
复制
x = np.random.random(10**5)
expected = using_indexed_assignment(x)
for func in (using_argsort_twice, using_digitize, using_rankdata):
    assert np.allclose(expected, func(x))

这些IPython %timeit基准测试表明,对于大型阵列,using_indexed_assignment是最快的:

代码语言:javascript
复制
In [50]: x = np.random.random(10**5)
In [66]: %timeit using_indexed_assignment(x)
100 loops, best of 3: 9.32 ms per loop

In [70]: %timeit using_rankdata(x)
100 loops, best of 3: 10.6 ms per loop

In [56]: %timeit using_argsort_twice(x)
100 loops, best of 3: 16.2 ms per loop

In [59]: %timeit using_digitize(x)
10 loops, best of 3: 27 ms per loop

对于小型阵列,using_argsort_twice可能更快:

代码语言:javascript
复制
In [78]: x = np.random.random(10**2)

In [81]: %timeit using_argsort_twice(x)
100000 loops, best of 3: 3.45 µs per loop

In [79]: %timeit using_indexed_assignment(x)
100000 loops, best of 3: 4.78 µs per loop

In [80]: %timeit using_rankdata(x)
100000 loops, best of 3: 19 µs per loop

In [82]: %timeit using_digitize(x)
10000 loops, best of 3: 26.2 µs per loop

还要注意,stats.rankdata让您可以更好地控制如何处理等值的元素。

票数 48
EN

Stack Overflow用户

发布于 2013-07-28 02:48:07

正如the documentation所说,argsort

返回对数组进行排序的索引。

这意味着argsort的第一个元素是应该首先排序的元素的索引,第二个元素是应该排在第二位的元素的索引,依此类推。

您似乎想要的是值的排名顺序,这是由scipy.stats.rankdata提供的。请注意,您需要考虑如果队伍中存在平局会发生什么。

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

https://stackoverflow.com/questions/17901218

复制
相关文章

相似问题

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