Cara menghitung jumlah elemen sebenarnya dalam array bool NumPy

180

Saya memiliki array NumPy 'boolarr' dari tipe boolean. Saya ingin menghitung jumlah elemen yang nilainya True. Apakah ada rutinitas NumPy atau Python yang didedikasikan untuk tugas ini? Atau, apakah saya perlu mengulangi elemen-elemen dalam skrip saya?

norio
sumber

Jawaban:

261

Anda memiliki banyak opsi. Dua opsi adalah sebagai berikut.

numpy.sum(boolarr)
numpy.count_nonzero(boolarr)

Ini sebuah contoh:

>>> import numpy as np
>>> boolarr = np.array([[0, 0, 1], [1, 0, 1], [1, 0, 1]], dtype=np.bool)
>>> boolarr
array([[False, False,  True],
       [ True, False,  True],
       [ True, False,  True]], dtype=bool)

>>> np.sum(boolarr)
5

Tentu saja, itu adalah booljawaban yang spesifik. Secara umum, Anda dapat menggunakan numpy.count_nonzero.

>>> np.count_nonzero(boolarr)
5
David Alber
sumber
2
Terima kasih, David. Mereka terlihat rapi. Tentang metode dengan jumlah (..), apakah Benar selalu sama dengan 1 dalam python (atau setidaknya dalam numpy)? Jika tidak dijamin, saya akan menambahkan cek, 'jika Benar == 1:' sebelumnya. Tentang count_nonzero (..), sayangnya, sepertinya tidak diimplementasikan dalam modul numpy saya di versi 1.5.1, tetapi saya mungkin memiliki kesempatan untuk menggunakannya di masa depan.
norio
4
@norio Mengenai bool: nilai boolean diperlakukan sebagai 1 dan 0 dalam operasi aritmatika. Lihat " Nilai Boolean " dalam dokumentasi Python Standard Library. Perhatikan bahwa NumPy's booldan Python booltidak sama, tetapi mereka kompatibel (lihat di sini untuk informasi lebih lanjut).
David Alber
1
@norio Mengenai numpy.count_nonzerotidak berada dalam NumPy v1.5.1: Anda benar. Menurut pengumuman rilis ini , ditambahkan dalam NumPy v1.6.0.
David Alber
25
FWIW, numpy.count_nonzerosekitar seribu kali lebih cepat, paling tidak dalam interpreter Python saya. python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "np.count_nonzero(bools)"vs.python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)"
chbrown
6
@ Chbrown kamu benar. Tetapi Anda harus membandingkannya np.sum(bools)sebagai gantinya! Namun, np.count_nonzero(bools)masih ~ 12x lebih cepat.
mab
29

Pertanyaan itu memecahkan pertanyaan yang sangat mirip bagi saya dan saya pikir saya harus berbagi:

Dalam python mentah, Anda dapat menggunakan sum()untuk menghitung Truenilai dalam list:

>>> sum([True,True,True,False,False])
3

Tetapi ini tidak akan berhasil:

>>> sum([[False, False, True], [True, False, True]])
TypeError...
Guillaume Gendre
sumber
Anda harus "meratakan" array array terlebih dahulu. sayangnya, tidak ada metode builtin, lihat stackoverflow.com/questions/2158395/...
tommy chheng
2
Guillaume terima kasih! Bekerja dengan kerangka data Pandas juga.
JJFord3
4

Dalam hal membandingkan dua array numpy dan menghitung jumlah kecocokan (mis prediksi kelas yang benar dalam pembelajaran mesin), saya menemukan contoh di bawah ini untuk dua dimensi berguna:

import numpy as np
result = np.random.randint(3,size=(5,2)) # 5x2 random integer array
target = np.random.randint(3,size=(5,2)) # 5x2 random integer array

res = np.equal(result,target)
print result
print target
print np.sum(res[:,0])
print np.sum(res[:,1])

yang dapat diperluas ke dimensi D.

Hasilnya adalah:

Ramalan:

[[1 2]
 [2 0]
 [2 0]
 [1 2]
 [1 2]]

Target:

[[0 1]
 [1 0]
 [2 0]
 [0 0]
 [2 1]]

Hitungan prediksi yang benar untuk D = 1: 1

Hitungan prediksi yang benar untuk D = 2: 2

salehinejad
sumber