एक NumPy बूल सरणी में सच्चे तत्वों की संख्या की गणना कैसे करें


180

मेरे पास बूलियन प्रकार का न्यूमरी सरणी 'बूलर' है। मैं उन तत्वों की संख्या गिनना चाहता हूं जिनके मूल्य हैं True। क्या इस कार्य के लिए एक NumPy या पायथन रूटीन समर्पित है? या, क्या मुझे अपनी स्क्रिप्ट में तत्वों पर पुनरावृति करने की आवश्यकता है?


4
पांडा के लिए: stackoverflow.com/questions/26053849/…
निजी

जवाबों:


261

आपके पास कई विकल्प हैं। दो विकल्प निम्नलिखित हैं।

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

2
धन्यवाद, डेविड। वे साफ-सुथरे दिखते हैं। राशि (..) के साथ विधि के बारे में, क्या सच में अजगर में 1 के बराबर है (या कम से कम सुन्न में)? यदि इसकी गारंटी नहीं है, तो मैं पहले से एक चेक जोड़ दूंगा, 'अगर True == 1:'। Count_nonzero (..) के बारे में, दुर्भाग्य से, यह 1.5.1 संस्करण में मेरे संख्यात्मक मॉड्यूल में लागू नहीं हुआ है, लेकिन मुझे भविष्य में इसका उपयोग करने का मौका मिल सकता है।
नोरियो

4
@ नॉरियो के संबंध में bool: बूलियन मान को अंकगणितीय संचालन में 1 और 0 के रूप में माना जाता है। पायथन स्टैंडर्ड लाइब्रेरी डॉक्यूमेंटेशन में " बुलियन वैल्यूज़ " देखें । ध्यान दें कि NumPy boolऔर Python boolसमान नहीं हैं, लेकिन वे संगत हैं ( अधिक जानकारी के लिए यहां देखें)।
डेविड अल्बर्ट

1
@ नॉरियो के बारे numpy.count_nonzeroमें NumPy v1.5.1 में नहीं होने के बारे में: आप सही हैं। इस रिलीज़ घोषणा के अनुसार , इसे NumPy v1.6.0 में जोड़ा गया था।
डेविड अल्बर्ट

25
FWIW, 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)"
chbrown

6
@chbrown आप सही हैं। लेकिन आपको np.sum(bools)इसके बजाय तुलना करनी चाहिए ! हालांकि, np.count_nonzero(bools)अभी भी ~ 12x तेज है।
mab

29

उस प्रश्न ने मेरे लिए एक समान प्रश्न हल किया और मुझे लगा कि मुझे साझा करना चाहिए:

कच्चे अजगर में आप मानों sum()को गिनने के लिए उपयोग कर सकते हैं :Truelist

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

लेकिन यह काम नहीं करेगा:

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

आपको पहले सरणियों के सरणी को "समतल" करना चाहिए। दुर्भाग्य से, कोई
बिलिन

2
धन्यवाद गिलौम! पंडों डेटाफ्रेम के साथ भी काम करता है।
JJFord3

4

दो सुन्न सारणियों की तुलना करने और मैचों की संख्या (जैसे मशीन सीखने में सही वर्ग भविष्यवाणी) की गिनती के संदर्भ में, मुझे नीचे दिए गए उदाहरण दो आयामों के लिए उपयोगी लगे:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.