Pertanyaan Numpy argsort - apa yang dilakukannya?


Mengapa numpy memberikan hasil ini:

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

>[2 3 1 0]

ketika saya mengharapkannya melakukan ini:

[3 2 0 1]

Jelas pemahaman saya tentang fungsi ini kurang.


75
2017-07-27 18:44


asal


Jawaban:


Menurut dokumentasi

Mengembalikan indeks yang akan mengurutkan array.

  • 2 adalah indeks 0.0.
  • 3 adalah indeks 0.1.
  • 1 adalah indeks 1.41.
  • 0 adalah indeks 1.48.

80
2017-07-27 18:48



[2, 3, 1, 0] menunjukkan bahwa elemen terkecil adalah pada indeks 2, terkecil berikutnya pada indeks 3, kemudian indeks 1, lalu indeks 0.

Ada sejumlah cara untuk mendapatkan hasil yang Anda cari:

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

Sebagai contoh,

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

Ini memeriksa bahwa semuanya menghasilkan hasil yang sama:

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 ini %timeit tolok ukur menyarankan untuk array besar using_indexed_assignment adalah yang tercepat:

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

Untuk array kecil, using_argsort_twice mungkin lebih cepat:

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

Perhatikan juga itu stats.rankdata memberi Anda kontrol lebih besar tentang cara menangani elemen dengan nilai yang sama.


26
2017-07-27 18:47



Sebagai dokumentasi berkata, argsort:

Mengembalikan indeks yang akan mengurutkan array.

Itu berarti elemen pertama dari argsort adalah indeks elemen yang harus diurutkan terlebih dahulu, elemen kedua adalah indeks elemen yang harus menjadi yang kedua, dll.

Apa yang Anda inginkan adalah urutan peringkat dari nilai-nilai, yaitu apa yang disediakan oleh scipy.stats.rankdata. Perhatikan bahwa Anda perlu memikirkan tentang apa yang seharusnya terjadi jika ada ikatan dalam pangkat.


2
2017-07-27 18:48



Pertama, diperintahkan array. Kemudian hasilkan array dengan indeks awal dari array.


0
2018-06-27 01:27



Hanya ingin langsung kontras pemahaman asli OP terhadap implementasi aktual dengan kode.

numpy.argsort didefinisikan seperti itu

x[x.argsort()] == numpy.sort(x) # this will be an array of True's

OP awalnya berpikir bahwa itu didefinisikan seperti itu

x == numpy.sort(x)[x.argsort()] # this will not be True

0
2017-11-17 07:33



memasukkan:
    impor numpy sebagai np
    x = np.array ([1.48,1.41,0.0,0.1])
    x.argsort (). argsort ()

keluaran:
array ([3, 2, 0, 1])


0
2018-02-18 01:50



np.argsort mengembalikan indeks array yang diurutkan yang diberikan oleh 'jenis' (yang menentukan jenis algoritma pengurutan). Namun, ketika daftar digunakan dengan np.argmax, itu mengembalikan indeks dari elemen terbesar dalam daftar. Sementara, np.sort, sortir array yang diberikan, daftar.


0
2017-07-22 08:47