मेरे पास बूलियन प्रकार का न्यूमरी सरणी 'बूलर' है। मैं उन तत्वों की संख्या गिनना चाहता हूं जिनके मूल्य हैं True
। क्या इस कार्य के लिए एक NumPy या पायथन रूटीन समर्पित है? या, क्या मुझे अपनी स्क्रिप्ट में तत्वों पर पुनरावृति करने की आवश्यकता है?
मेरे पास बूलियन प्रकार का न्यूमरी सरणी 'बूलर' है। मैं उन तत्वों की संख्या गिनना चाहता हूं जिनके मूल्य हैं True
। क्या इस कार्य के लिए एक NumPy या पायथन रूटीन समर्पित है? या, क्या मुझे अपनी स्क्रिप्ट में तत्वों पर पुनरावृति करने की आवश्यकता है?
जवाबों:
आपके पास कई विकल्प हैं। दो विकल्प निम्नलिखित हैं।
numpy.sum(boolarr)
numpy.count_nonzero(boolarr)
यहाँ एक उदाहरण है:
>>> 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
बेशक, यह एक bool
विशिष्ट जवाब है। अधिक आम तौर पर, आप उपयोग कर सकते हैं numpy.count_nonzero
।
>>> np.count_nonzero(boolarr)
5
bool
: बूलियन मान को अंकगणितीय संचालन में 1 और 0 के रूप में माना जाता है। पायथन स्टैंडर्ड लाइब्रेरी डॉक्यूमेंटेशन में " बुलियन वैल्यूज़ " देखें । ध्यान दें कि NumPy bool
और Python bool
समान नहीं हैं, लेकिन वे संगत हैं ( अधिक जानकारी के लिए यहां देखें)।
numpy.count_nonzero
में NumPy v1.5.1 में नहीं होने के बारे में: आप सही हैं। इस रिलीज़ घोषणा के अनुसार , इसे NumPy v1.6.0 में जोड़ा गया था।
numpy.count_nonzero
मेरे पायथन दुभाषिया में कम से कम एक हजार गुना तेज है। python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "np.count_nonzero(bools)"
बनामpython -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)"
np.sum(bools)
इसके बजाय तुलना करनी चाहिए ! हालांकि, np.count_nonzero(bools)
अभी भी ~ 12x तेज है।
उस प्रश्न ने मेरे लिए एक समान प्रश्न हल किया और मुझे लगा कि मुझे साझा करना चाहिए:
कच्चे अजगर में आप मानों sum()
को गिनने के लिए उपयोग कर सकते हैं :True
list
>>> sum([True,True,True,False,False])
3
लेकिन यह काम नहीं करेगा:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
दो सुन्न सारणियों की तुलना करने और मैचों की संख्या (जैसे मशीन सीखने में सही वर्ग भविष्यवाणी) की गिनती के संदर्भ में, मुझे नीचे दिए गए उदाहरण दो आयामों के लिए उपयोगी लगे:
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 आयामों तक बढ़ाया जा सकता है।
परिणाम हैं:
भविष्यवाणी:
[[1 2]
[2 0]
[2 0]
[1 2]
[1 2]]
लक्ष्य:
[[0 1]
[1 0]
[2 0]
[0 0]
[2 1]]
डी = 1 के लिए सही भविष्यवाणी की गणना: 1
D = 2 के लिए सही भविष्यवाणी की गणना: 2