Dalam Python, saya memiliki ndarray y
yang dicetak sebagaiarray([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
Saya mencoba untuk menghitung berapa banyak 0
dan berapa banyak 1
yang ada dalam array ini.
Tetapi ketika saya mengetik y.count(0)
atau y.count(1)
, katanya
numpy.ndarray
objek tidak memiliki atributcount
Apa yang harus saya lakukan?
python
numpy
multidimensional-array
count
mflowww
sumber
sumber
numpy.count_nonzero
.Jawaban:
Cara non-numpy :
Gunakan
collections.Counter
;sumber
dict(zip(*numpy.unique(a, return_counts=True)))
collections.Counter
bekerja dengan baikBagaimana dengan menggunakan
numpy.count_nonzero
, sesuatu sepertisumber
numpy.ndarray
OP awalnya bertanya.Secara pribadi, saya akan pergi untuk:
(y == 0).sum()
dan(y == 1).sum()
Misalnya
sumber
sum( vector==value )
Untuk kasus Anda, Anda juga bisa melihat numpy.bincount
sumber
Konversikan array Anda
y
menjadi daftarl
lalu lakukanl.count(1)
danl.count(0)
sumber
Jika Anda tahu bahwa mereka adil
0
dan1
:memberi Anda jumlah yang.
np.sum(1-y)
memberikan nol.Untuk sedikit generalisasi, jika Anda ingin menghitung
0
dan bukan nol (tetapi mungkin 2 atau 3):memberikan angka bukan nol.
Tetapi jika Anda membutuhkan sesuatu yang lebih rumit, saya tidak berpikir numpy akan memberikan
count
opsi yang bagus . Dalam hal ini, buka koleksi:Ini berperilaku seperti dict
sumber
Jika Anda tahu persis nomor yang Anda cari, Anda dapat menggunakan yang berikut ini;
mengembalikan berapa kali 2 terjadi dalam array Anda.
sumber
Jujur saya merasa paling mudah untuk mengonversi ke Seri panda atau DataFrame:
Atau satu kalimat yang disarankan oleh Robert Muil:
sumber
pd.Series([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]).value_counts()
Tidak ada yang menyarankan untuk menggunakan
numpy.bincount(input, minlength)
denganminlength = np.size(input)
, tetapi tampaknya menjadi solusi yang baik, dan pasti tercepat :Itu percepatan gila antara
numpy.unique(x, return_counts=True)
dannumpy.bincount(x, minlength=np.max(x))
!sumber
np.histogram
tidak menghitung hal yang sama. Tidak ada gunanya membandingkan tiga pendekatan yang saya usulkan denganhistogram
fungsi, maaf.bincount
hanya bekerja untuk bilangan bulat, jadi itu berfungsi untuk masalah OP, tapi mungkin tidak untuk masalah umum yang dijelaskan dalam judul. Anda juga sudah mencoba menggunakanbincount
dengan array dengan int yang sangat besar?bincount
sekitar empat kali lebih cepat daripadaunique
.Bagaimana dengan
len(y[y==0])
danlen(y[y==1])
?sumber
y.tolist().count(val)
dengan val 0 atau 1
Karena daftar python memiliki fungsi asli
count
, mengonversi ke daftar sebelum menggunakan fungsi itu adalah solusi sederhana.sumber
Namun solusi sederhana lain mungkin menggunakan numpy.count_nonzero () :
Jangan biarkan namanya menyesatkan Anda, jika Anda menggunakannya dengan boolean seperti dalam contoh, itu akan melakukan trik.
sumber
Untuk menghitung jumlah kejadian, Anda dapat menggunakan
np.unique(array, return_counts=True)
:sumber
Saya akan menggunakan np.where:
sumber
manfaatkan metode yang ditawarkan oleh Seri:
sumber
Jawaban umum dan sederhana adalah:
yang akan menghasilkan kode lengkap ini sebagai contoh
Sekarang jika MyArray berada dalam beberapa dimensi dan Anda ingin menghitung kemunculan distribusi nilai dalam garis (= pola selanjutnya)
sumber
Anda dapat menggunakan pemahaman kamus untuk membuat one-liner yang rapi. Lebih lanjut tentang pemahaman kamus dapat ditemukan di sini
Ini akan membuat kamus dengan nilai-nilai di ndarray Anda sebagai kunci, dan jumlah nilai sebagai nilai untuk kunci masing-masing.
Ini akan berfungsi kapan pun Anda ingin menghitung kemunculan nilai dalam larik format ini.
sumber
Coba ini:
sumber
Ini dapat dilakukan dengan mudah dalam metode berikut
sumber
Karena ndarray Anda hanya berisi 0 dan 1, Anda dapat menggunakan sum () untuk mendapatkan kemunculan 1s dan len () - sum () untuk mendapatkan kemunculan 0s.
sumber
Anda memiliki larik khusus dengan hanya 1 dan 0 di sini. Jadi triknya adalah menggunakan
yang memberi Anda persentase 1 dalam array Anda. Atau, gunakan
akan memberi Anda angka absolut 1 dan 0 dalam array Anda.
sumber
Hanya menyalin komentar Seppo Enarvi di sini yang pantas menjadi jawaban yang tepat
sumber
Ini melibatkan satu langkah lagi, tetapi solusi yang lebih fleksibel yang juga akan bekerja untuk array 2d dan filter yang lebih rumit adalah membuat topeng boolean dan kemudian menggunakan .sum () pada topeng.
sumber
Jika Anda tidak ingin menggunakan modul numpy atau koleksi, Anda dapat menggunakan kamus:
hasil:
Tentu saja Anda juga dapat menggunakan pernyataan if / else. Saya pikir fungsi Penghitung melakukan hal yang hampir sama tetapi ini lebih transparan.
sumber
Untuk entri umum:
Akan menampilkan hitungan:
Dan indeks:
sumber
di sini saya memiliki sesuatu, di mana Anda dapat menghitung jumlah kemunculan nomor tertentu: sesuai dengan kode Anda
count_of_zero = daftar (y [y == 0]). count (0)
print (count_of_zero)
// menurut pertandingan akan ada nilai boolean dan menurut nilai True angka 0 akan kembali
sumber
Jika Anda tertarik dengan eksekusi tercepat, Anda tahu sebelumnya nilai mana yang harus dicari, dan array Anda adalah 1D, atau Anda sebaliknya tertarik pada hasil pada array yang rata (dalam hal ini input fungsi harus menjadi
np.flatten(arr)
lebih dari adilarr
), maka Numba adalah teman Anda:atau, untuk array yang sangat besar di mana paralelisasi mungkin bermanfaat:
Benchmarking ini terhadap
np.count_nonzero()
(yang juga memiliki masalah membuat array sementara yang dapat dihindari) dannp.unique()
solusi berbasisuntuk input yang dihasilkan dengan:
plot berikut diperoleh (baris kedua plot adalah zoom pada pendekatan yang lebih cepat):
Menunjukkan bahwa solusi berbasis Numba terasa lebih cepat daripada rekan NumPy, dan, untuk input yang sangat besar, pendekatan paralelnya lebih cepat daripada yang naif.
Kode lengkap tersedia di sini .
sumber
jika Anda berurusan dengan array yang sangat besar menggunakan generator bisa menjadi pilihan. Yang menyenangkan di sini adalah bahwa pendekatan ini berfungsi baik untuk array dan daftar dan Anda tidak memerlukan paket tambahan. Selain itu, Anda tidak menggunakan banyak memori.
sumber
Numpy memiliki modul untuk ini. Hanya hack kecil. Masukkan array input Anda sebagai nampan.
Outputnya adalah 2 array. Satu dengan nilai-nilai itu sendiri, yang lain dengan frekuensi yang sesuai.
sumber
sumber