Cara menghitung jumlah elemen sebenarnya dalam array bool NumPy


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

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...

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.