Misalkan saya memiliki daftar berikut di python:
a = [1,2,3,1,2,1,1,1,3,2,2,1]
Bagaimana menemukan nomor paling sering dalam daftar ini dengan cara yang rapi?
python
numpy
statistics
Tepat waktu
sumber
sumber
np.bincount([1, 2, 3, 1, 2, 1, 1, 1, 3, 2, 2, 1]).argmax()
scipy.stats.mode
, meskipun kurang umum.Counter(array).most_common(1)[0][0]
Anda dapat menggunakan
Jika beberapa elemen sama seringnya dengan yang lain, kode ini hanya akan mengembalikan elemen pertama.
sumber
values[counts.argmax()]
akan mengembalikan nilai pertama. Untuk mendapatkan semuanya, kita bisa menggunakanvalues[counts == counts.max()]
.Jika Anda ingin menggunakan SciPy :
sumber
Pertunjukan (menggunakan iPython) untuk beberapa solusi yang ditemukan di sini:
Yang terbaik adalah 'max' dengan 'set' untuk array kecil seperti masalahnya.
Menurut @David Sanders, jika Anda meningkatkan ukuran array hingga 100.000 elemen, algoritme "max w / set" akan menjadi yang terburuk sejauh ini sedangkan metode "numpy bincount" adalah yang terbaik.
sumber
a = (np.random.rand(100000) * 1000).round().astype('int'); a_list = list(a)
), algoritme "max w / set" Anda akan menjadi yang terburuk sejauh ini sedangkan metode "numpy bincount" adalah yang terbaik. Saya melakukan tes ini menggunakana_list
kode python asli dana
untuk kode numpy untuk menghindari biaya penyusunan yang mengacaukan hasil.Juga jika Anda ingin mendapatkan nilai paling sering (positif atau negatif) tanpa memuat modul apa pun, Anda dapat menggunakan kode berikut:
sumber
max(set(lVals), key=lVals.count)
, yang menghitung O (n) untuk setiap elemen uniklVals
untuk sekitar O (n ^ 2) (dengan asumsi O (n) unik elemen). Menggunakancollections.Counter(lVals).most_common(1)[0][0]
dari pustaka standar, seperti yang disarankan oleh JoshAdel , hanya O (n).Meskipun sebagian besar jawaban di atas berguna, jika Anda: 1) membutuhkannya untuk mendukung nilai non-positif-integer (misalnya float atau integer negatif ;-)), dan 2) tidak ada di Python 2.7 (yang koleksi. memerlukan), dan 3) memilih untuk tidak menambahkan ketergantungan scipy (atau bahkan numpy) ke kode Anda, maka solusi murni python 2.6 yaitu O (nlogn) (yaitu, efisien) hanya ini:
sumber
Saya suka solusi dari JoshAdel.
Tapi hanya ada satu tangkapan.
The
np.bincount()
solusi hanya bekerja pada nomor.Jika Anda memiliki string,
collections.Counter
solusi akan bekerja untuk Anda.sumber
Memperluas metode ini , diterapkan untuk menemukan mode data di mana Anda mungkin memerlukan indeks array sebenarnya untuk melihat seberapa jauh nilai tersebut dari pusat distribusi.
Ingatlah untuk membuang mode ketika len (np.argmax (hitungan))> 1
sumber
Di Python 3, berikut ini seharusnya berfungsi:
sumber
Dimulai
Python 3.4
, pustaka standar menyertakanstatistics.mode
fungsi untuk mengembalikan satu titik data paling umum.Jika ada beberapa mode dengan frekuensi yang sama,
statistics.mode
mengembalikan mode yang pertama kali ditemukan.Dimulai
Python 3.8
,statistics.multimode
fungsi mengembalikan daftar nilai yang paling sering muncul dalam urutan saat pertama kali ditemukan:sumber
Berikut adalah solusi umum yang dapat diterapkan di sepanjang sumbu, berapa pun nilainya, menggunakan numpy murni. Saya juga menemukan bahwa ini jauh lebih cepat daripada scipy.stats.mode jika ada banyak nilai unik.
sumber
Saya baru-baru ini melakukan proyek dan menggunakan collections.Counter (Yang menyiksa saya).
Counter dalam koleksi memiliki performa yang sangat sangat buruk menurut saya. Ini hanya diktik pembungkus kelas ().
Yang lebih buruk, Jika Anda menggunakan cProfile untuk membuat profil metodenya, Anda akan melihat banyak hal '__missing__' dan '__instancecheck__' yang terbuang percuma.
Hati-hati menggunakan most_common (), karena setiap kali itu akan memanggil semacam yang membuatnya sangat lambat. dan jika Anda menggunakan most_common (x), ini akan memanggil jenis heap, yang juga lambat.
Btw, numpy bincount juga bermasalah: jika Anda menggunakan np.bincount ([1,2,4000000]), Anda akan mendapatkan array dengan 4000000 elemen.
sumber