NumPy bool dizisindeki gerçek öğelerin sayısı nasıl sayılır


Yanıtlar:


262

Birden fazla seçeneğiniz var. İki seçenek şunlardır.

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

İşte bir örnek:

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

Tabii ki, bu özel bir boolcevap. Daha genel olarak, kullanabilirsiniz numpy.count_nonzero.

>>> np.count_nonzero(boolarr)
5

2
Teşekkürler, David. Düzgün görünüyorlar. Sum (..) yöntemiyle, True her zaman python'da (veya en azından numpy cinsinden) 1'e eşit mi? Eğer garanti edilmezse, önceden 'if True == 1:' şeklinde bir kontrol ekleyeceğim. Count_nonzero (..) hakkında, ne yazık ki, 1.5.1 sürümünde benim numpy modülünde uygulanmadığı görünüyor, ama gelecekte kullanmak için bir şans olabilir.
norio

4
@norio ile ilgili bool: boolean değerleri aritmetik işlemlerde 1 ve 0 olarak değerlendirilir. Bkz . Python Standart Kütüphanesi dokümantasyonundaki " Boolean Değerleri ". NumPy's boolve Python'un boolaynı olmadığını, ancak uyumlu olduklarını unutmayın ( daha fazla bilgi için buraya bakın ).
David Alber

1
@norio numpy.count_nonzeroNumPy v1.5.1'de olmama konusunda: haklısınız. Bu duyuruya göre , NumPy v1.6.0'da eklendi.
David Alber

25
FWIW, numpy.count_nonzeroen azından Python yorumcumda yaklaşık bin kat daha hızlı. 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 haklısın. Ama np.sum(bools)bunun yerine karşılaştırmalısınız ! Ancak, np.count_nonzero(bools)hala ~ 12 kat daha hızlıdır.
mab

30

Bu soru benim için oldukça benzer bir soruyu çözdü ve paylaşmam gerektiğini düşündüm:

Ham python'da aşağıdakilerdeki değerleri sum()saymak için kullanabilirsiniz :Truelist

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

Ancak bu işe yaramaz:

>>> sum([[False, False, True], [True, False, True]])
TypeError...

Önce dizi dizisini "düzleştirmelisiniz". ne yazık ki, yerleşik bir yöntem yok, bkz. stackoverflow.com/questions/2158395/…
tommy chheng

2
Teşekkürler Guillaume! Panda veri çerçeveleri ile de çalışır.
JJFord3

5

İki numpy dizisini karşılaştırma ve eşleşme sayısını sayma (örneğin, makine öğreniminde doğru sınıf tahmini) açısından, iki boyut için aşağıdaki örneği yararlı buldum:

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])

D boyutlarına kadar genişletilebilir.

Sonuçlar:

Tahmin:

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

Hedef:

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

D = 1 için doğru tahmin sayısı: 1

D = 2 için doğru tahmin sayısı: 2

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.