Bagaimana saya bisa mengurutkan array di NumPy berdasarkan kolom ke-n?
Sebagai contoh,
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
Saya ingin mengurutkan baris menurut kolom kedua, sehingga saya dapat kembali:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
np.sort(a, axis=0)
akan menjadi solusi yang memuaskan untuk matriks yang diberikan. Saya menyarankan edit dengan contoh yang lebih baik tetapi ditolak, meskipun sebenarnya pertanyaannya akan jauh lebih jelas. Contohnya harus sepertia = numpy.array([[1, 2, 3], [6, 5, 2], [3, 1, 1]])
dengan keluaran yang diinginkanarray([[3, 1, 1], [1, 2, 3], [6, 5, 2]])
Jawaban:
@ Steve 's jawabannya sebenarnya adalah cara yang paling elegan untuk melakukannya.
Untuk cara yang "benar" lihat argumen kata kunci pesanan dari numpy.ndarray.sort
Namun, Anda harus melihat array Anda sebagai array dengan bidang (array terstruktur).
Cara "benar" cukup jelek jika Anda awalnya tidak mendefinisikan array dengan bidang ...
Sebagai contoh cepat, untuk mengurutkannya dan mengembalikan salinan:
Untuk mengurutkannya di tempat:
@ Steve benar-benar adalah cara paling elegan untuk melakukannya, sejauh yang saya tahu ...
Satu-satunya keuntungan dari metode ini adalah bahwa argumen "urutan" adalah daftar bidang untuk memesan pencarian. Misalnya, Anda bisa mengurutkan berdasarkan kolom kedua, lalu kolom ketiga, lalu kolom pertama dengan memasok order = ['f1', 'f2', 'f0'].
sumber
ValueError: new type not compatible with array.
float
? Haruskah saya mengubah sesuatu?a = np.array([['a',1,2,3],['b',4,5,6],['c',0,0,1]])
apa pendekatan yang harus saya ikuti?np.argsort
mereka sendiri mungkin mengambil cukup banyak memori, dan di atas itu, pengindeksan dengan array juga akan menghasilkan salinan array yang sedang diurutkan.Saya kira ini bekerja:
a[a[:,1].argsort()]
Ini menunjukkan kolom kedua
a
dan mengurutkannya berdasarkan itu.sumber
1
di sini? indeks yang akan disortir?[:,1]
menunjukkan kolom keduaa
.a[a[:,1].argsort()[::-1]]
np.sort
atau tidak?ind = np.argsort( a[:,1] ); a = a[ind]
Anda dapat mengurutkan pada beberapa kolom sesuai metode Steve Tjoa dengan menggunakan pengurutan stabil seperti mergesort dan mengurutkan indeks dari kolom yang paling signifikan ke yang paling signifikan:
Ini mengurutkan berdasarkan kolom 0, lalu 1, lalu 2.
sumber
Jika seseorang ingin memanfaatkan penyortiran pada bagian penting dari program mereka di sini adalah perbandingan kinerja untuk berbagai proposal
Jadi, sepertinya pengindeksan dengan argsort adalah metode tercepat sejauh ini ...
sumber
Dari wiki dokumentasi Python , saya pikir Anda dapat melakukannya:
Outputnya adalah:
sumber
Dari milis NumPy , berikut adalah solusi lain:
sumber
a[np.lexsort(a.T[cols])]
. dimanacols=[1]
dalam pertanyaan aslinya.Saya punya masalah serupa.
Masalahku:
Saya ingin menghitung SVD dan perlu mengurutkan nilai eigen saya dalam urutan menurun. Tapi saya ingin menjaga pemetaan antara nilai eigen dan vektor eigen. Nilai eigen saya ada di baris pertama dan vektor eigen yang sesuai di bawahnya di kolom yang sama.
Jadi saya ingin mengurutkan array dua dimensi kolom-bijaksana dengan baris pertama dalam urutan menurun.
Solusi saya
Jadi bagaimana cara kerjanya?
a[0,]
hanya baris pertama yang ingin saya urutkan berdasarkan.Sekarang saya menggunakan argsort untuk mendapatkan urutan indeks.
Saya menggunakan
[::-1]
karena saya perlu memesan.Terakhir saya gunakan
a[::, ...]
untuk mendapatkan tampilan dengan kolom dalam urutan yang benar.sumber
Contoh yang sedikit lebih rumit
lexsort
- turun pada kolom 1, naik kedua pada kolom ke-2. Trik dengan itulexsort
adalah jenis pada baris (karenanya.T
), dan memberikan prioritas ke yang terakhir.sumber
Berikut adalah solusi lain yang mempertimbangkan semua kolom (cara JJ yang lebih ringkas );
Sortir dengan lexsort,
Keluaran:
sumber
Cukup menggunakan sortir, gunakan nomor kolom berdasarkan yang ingin Anda sortir.
sumber
Ini adalah pertanyaan lama tetapi jika Anda perlu menggeneralisasi ini ke array yang lebih tinggi dari 2 dimensi, inilah solusinya daripada yang dapat digeneralisasikan dengan mudah:
Ini adalah kerja keras yang berlebihan untuk dua dimensi dan
a[a[:,1].argsort()]
akan cukup untuk setiap jawaban, tetapi jawaban itu tidak dapat digeneralisasikan ke dimensi yang lebih tinggi. Anda dapat menemukan contoh array 3D dalam pertanyaan ini.Keluaran:
sumber