একটি NumPy বুল অ্যারেতে সত্য উপাদানগুলির সংখ্যা কীভাবে গণনা করা যায়


180

আমার কাছে বুলিয়ান টাইপের একটি নম্পপি অ্যারে 'বুলার' রয়েছে। যার মানগুলির উপাদানগুলি আমি গণনা করতে চাই True। এই কাজের জন্য কি কোনও নম্পপি বা পাইথন রুটিন নিবেদিত আছে? বা, আমার স্ক্রিপ্টের উপাদানগুলির বিষয়ে আমার পুনরুক্তি করা দরকার?


উত্তর:


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 এর সমান? যদি এটির গ্যারান্টি না দেওয়া হয় তবে আমি আগে থেকেই একটি চেক যুক্ত করব, 'সত্য হলে == 1:'। কাউন্ট_অনজারো (..) সম্পর্কে, দুর্ভাগ্যক্রমে, এটি আমার অদ্ভুত মডিউলটিতে 1.5.1 সংস্করণে প্রয়োগ করা হয়নি বলে মনে হয় তবে ভবিষ্যতে এটি ব্যবহার করার সুযোগ আমার থাকতে পারে।
ন্যারিও

4
@ নরিও সম্পর্কিত bool: বুলিয়ান মানগুলি গাণিতিক ক্রিয়াকলাপগুলিতে 1 এবং 0 হিসাবে বিবেচিত হয়। পাইথন স্ট্যান্ডার্ড লাইব্রেরি ডকুমেন্টেশনে " বুলিয়ান মান " দেখুন । মনে রাখবেন যে NumPy boolএবং পাইথন boolএক নয়, তবে তারা সামঞ্জস্যপূর্ণ ( আরও তথ্যের জন্য এখানে দেখুন)।
ডেভিড আলবার

1
@ নরিও নুমপি v1.5.1 এ numpy.count_nonzeroনা থাকার বিষয়ে : আপনি ঠিক বলেছেন। এই প্রকাশের ঘোষণা অনুযায়ী এটি NumPy v1.6.0 এ যুক্ত হয়েছিল।
ডেভিড আলবার

25
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
আপনি ঠিক বলেছেন ঠিক আছে তবে আপনার np.sum(bools)পরিবর্তে তুলনা করা উচিত ! তবে np.count_nonzero(bools)এখনও 12x ডলার দ্রুত faster
mab

29

এই প্রশ্নটি আমার জন্য বেশ অনুরূপ প্রশ্নের সমাধান করেছে এবং আমি ভেবেছিলাম আমার ভাগ করা উচিত:

কাঁচা পাইথনে আপনি মানগুলিতে একটি sum()গণনা করতে ব্যবহার করতে পারেন :Truelist

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

তবে এটি কাজ করবে না:

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

আপনার প্রথমে অ্যারের অ্যারে "সমতল" করা উচিত। দুর্ভাগ্যবশত, কোন builtin পদ্ধতি আছে, দেখতে stackoverflow.com/questions/2158395/...
টমি chheng

2
ধন্যবাদ গিলিয়াম! পান্ডাস ডেটা ফ্রেমগুলির সাথেও কাজ করে।
জেজেফোর্ড 3

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

যা ডি মাত্রায় প্রসারিত হতে পারে।

ফলাফলগুলি হ'ল:

প্রেডিক্সন:

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

টার্গেট:

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

ডি = 1 এর জন্য সঠিক পূর্বাভাস গণনা: 1

ডি = 2 এর জন্য সঠিক পূর্বাভাস গণনা: 2


3

আপনি যদি প্রতি সারি গণনা করতে চান তবে সরবরাহ axis=1করুন sum:

boolarr
# array([[False, False,  True],
#        [ True, False,  True],
#        [ True, False,  True]], dtype=bool)

boolarr.sum(axis=1)
# array([1, 2, 2])

একইভাবে, সাথে np.count_nonzero:

np.count_nonzero(boolarr, axis=1)
# array([1, 2, 2])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.