155

numpy がこの結果を出す理由:

x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()

>[2 3 1 0]

これを行うと予想される場合:

[3 2 0 1]

明らかに、機能に対する私の理解が欠けています。

4

10 に答える 10

165

ドキュメントによると

配列をソートするインデックスを返します。

  • 2のインデックスです0.0
  • 3のインデックスです0.1
  • 1のインデックスです1.41
  • 0のインデックスです1.48
于 2013-07-27T18:48:07.930 に答える
48

[2, 3, 1, 0]最小の要素がインデックス 2 にあり、次に小さい要素がインデックス 3、次にインデックス 1、次にインデックス 0 であることを示します。

探している結果を得るには、いくつかの方法があります。

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

例えば、

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])

これは、それらがすべて同じ結果を生成することを確認します。

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が最速であることを示唆しています。

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場合、より高速になる場合があります。

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また、等しい値の要素を処理する方法をより詳細に制御できることに注意してください。

于 2013-07-27T18:47:52.837 に答える
4

ドキュメントが言うように、argsort

配列をソートするインデックスを返します。

つまり、argsort の最初の要素は最初にソートする必要がある要素のインデックスであり、2 番目の要素は 2 番目にソートする必要がある要素のインデックスです。

あなたが望んでいるように見えるのは、によって提供される値のランク順ですscipy.stats.rankdata。ランクが同点の場合にどうするかを考える必要があることに注意してください。

于 2013-07-27T18:48:07.037 に答える
0

まず、アレイを注文しました。次に、配列の初期インデックスを使用して配列を生成します。

于 2017-06-27T01:27:27.490 に答える