Di numpy
/ scipy
, apakah ada cara yang efisien untuk mendapatkan jumlah frekuensi untuk nilai unik dalam array?
Sesuatu di sepanjang garis ini:
x = array( [1,1,1,2,2,2,5,25,1,1] )
y = freq_count( x )
print y
>> [[1, 5], [2,3], [5,1], [25,1]]
(Untuk Anda, pengguna R di luar sana, pada dasarnya saya mencari table()
fungsi)
collections.Counter(x)
cukup?Jawaban:
Lihatlah
np.bincount
:http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html
Lalu:
atau:
atau bagaimanapun Anda ingin menggabungkan jumlah dan nilai unik.
sumber
Pada Numpy 1.9, metode termudah dan tercepat adalah dengan hanya menggunakan
numpy.unique
, yang sekarang memilikireturn_counts
argumen kata kunci:Pemberian yang mana:
Perbandingan cepat dengan
scipy.stats.itemfreq
:sumber
return_counts
argumen kata kunci tidak ada, yang mungkin menjelaskan pengecualian. Dalam hal ini, dokumen menyarankan yangnp.unique(x, True)
setara dengannp.unique(x, return_index=True)
, yang tidak mengembalikan jumlah.unique, idx = np.unique(x, return_inverse=True); counts = np.bincount(idx)
. Ketika fitur ini ditambahkan (lihat di sini ) beberapa pengujian informal menggunakanreturn_counts
clocking lebih dari 5x lebih cepat.Pembaruan: Metode yang disebutkan dalam jawaban asli sudah usang, kita harus menggunakan cara baru sebagai gantinya:
Jawaban asli:
Anda dapat menggunakan scipy.stats.itemfreq
sumber
Saya juga tertarik dengan ini, jadi saya melakukan sedikit perbandingan kinerja (menggunakan perfplot , proyek kesayangan saya). Hasil:
sejauh ini yang tercepat. (Perhatikan skala log.)
Kode untuk menghasilkan plot:
sumber
equality_check=array_sorteq
diperfplot.show()
. Apa yang menyebabkan kesalahan (dalam Python 2) adalahpd.value_counts
(bahkan dengan sort = False).Menggunakan modul panda:
sumber
Sejauh ini ini adalah solusi yang paling umum dan performan; terkejut belum diposting.
Berbeda dengan jawaban yang saat ini diterima, ia bekerja pada semua tipe data yang dapat diurutkan (bukan hanya int positif), dan memiliki kinerja optimal; satu-satunya biaya yang signifikan adalah penyortiran yang dilakukan oleh np.unique.
sumber
AttributeError: 'numpy.ufunc' object has no attribute 'at'
np.bincount(inverse)
numpy.bincount
mungkin merupakan pilihan terbaik. Jika array Anda mengandung sesuatu selain bilangan bulat kecil, mungkin berguna untuk membungkusnya seperti ini:Sebagai contoh:
sumber
Meskipun sudah dijawab, saya menyarankan pendekatan berbeda yang memanfaatkan
numpy.histogram
. Fungsi yang diberi urutan ini mengembalikan frekuensi elemen-elemennya yang dikelompokkan dalam nampan .Namun waspadalah : ini berfungsi dalam contoh ini karena angka adalah bilangan bulat. Jika mereka di mana bilangan real, maka solusi ini tidak akan berlaku juga.
sumber
Ini memberi Anda: {1: 5, 2: 3, 5: 1, 25: 1}
sumber
collections.Counter(x)
juga memberikan hasil yang sama. Saya percaya OP menginginkan output yang menyerupaitable
fungsi R. MenjagaSeries
mungkin lebih bermanfaat.pd.Series(x).reshape(-1)
jika array multidimensi.Untuk menghitung non-integer unik - mirip dengan jawaban Eelco Hoogendoorn tetapi jauh lebih cepat (faktor 5 pada mesin saya), saya biasa
weave.inline
menggabungkannumpy.unique
dengan sedikit kode-c;Info profil
numpy
Versi murni Eelco :Catatan
Ada redundansi di sini (
unique
melakukan pengurutan juga), yang berarti bahwa kode mungkin dapat lebih dioptimalkan dengan meletakkanunique
fungsi di dalam loop kode-c.sumber
Pertanyaan lama, tetapi saya ingin memberikan solusi saya sendiri yang ternyata menjadi yang tercepat, gunakan normal
list
bukannp.array
sebagai input (atau transfer ke daftar terlebih dahulu), berdasarkan tes bangku saya.Lihat itu jika Anda menemukannya juga.
Sebagai contoh,
100000 loop, terbaik 3: 2,26 μs per loop
100000 loop, terbaik 3: 8,8 μs per loop
100000 loop, terbaik 3: 5,85 μs per loop
Sementara jawaban yang diterima akan lebih lambat, dan
scipy.stats.itemfreq
solusinya bahkan lebih buruk.Pengujian yang lebih mendalam tidak mengkonfirmasi ekspektasi yang dirumuskan.
Ref. komentar di bawah tentang cache dan efek samping dalam-RAM lainnya yang memengaruhi dataset kecil hasil pengujian berulang secara besar-besaran.
sumber
numpy
belum tentu cara untuk pergi.beberapa hal seperti ini harus dilakukan:
Juga, posting sebelumnya tentang penghitungan elemen unik ini secara efisien tampaknya sangat mirip dengan pertanyaan Anda, kecuali saya kehilangan sesuatu.
sumber
penghitungan frekuensi multi-dimensi, yaitu penghitungan array.
sumber
sumber
sumber