Ben bir Botanik türü bir NumPy dizi 'boolarr' var. Değerleri olan elemanların sayısını saymak istiyorum True
. Bu görev için ayrılmış bir NumPy veya Python yordamı var mı? Yoksa senaryomdaki öğeler üzerinde yineleme yapmam gerekir mi?
Ben bir Botanik türü bir NumPy dizi 'boolarr' var. Değerleri olan elemanların sayısını saymak istiyorum True
. Bu görev için ayrılmış bir NumPy veya Python yordamı var mı? Yoksa senaryomdaki öğeler üzerinde yineleme yapmam gerekir mi?
Yanıtlar:
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 bool
cevap. Daha genel olarak, kullanabilirsiniz numpy.count_nonzero
.
>>> np.count_nonzero(boolarr)
5
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 bool
ve Python'un bool
aynı olmadığını, ancak uyumlu olduklarını unutmayın ( daha fazla bilgi için buraya bakın ).
numpy.count_nonzero
NumPy v1.5.1'de olmama konusunda: haklısınız. Bu duyuruya göre , NumPy v1.6.0'da eklendi.
numpy.count_nonzero
en 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)"
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.
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 :True
list
>>> sum([True,True,True,False,False])
3
Ancak bu işe yaramaz:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
İ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