• 0

كيفية حساب عدد عناصر True في مصفوفة NumPy منطقية

لدي مصفوفة NumPy من نوع bool من النوع المنطقي. أريد حساب عدد العناصر التي تكون قيمها True. هل هناك دالة في Numpy أو Python مخصص لهذه المهمة؟ أو هل أحتاج إلى حلقة تكرار للعناصر الموجودة في المصفوفة الخاص بي؟

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

ببساة يمكنك استخدام التابع sum فكما نعلم أن هذا التابع يقوم بحساب مجموع قيم مصفوفة ما، لكن إذا طبقته على مصفوفة بوليانية سيقوم بعد عدد مرات ظهور القيمة True :

a=np.array([True,True,True,False,False])
sum(a)
# 3
# أما في حالة كانت المصفوفة متعددة الأبعاد
a=np.array([[True,True,True,False,False],[True,True,True,False,False]])
sum(a.ravel())
# 6
# أي يجب تسطيح المصفوفة إذا كانت بأكثر من بعد

أو ببساطة متناهية:

a=np.array([[True,True,True,False,False],[True,True,True,False,False]])
a[a].size

حيث أن ناتج a[a] هو:

array([ True,  True,  True,  True,  True,  True])

أي فقط القيم التي تعطي True من a. أو من خلال التابع np.count_nonzero(array) :

np.count_nonzero(a) # 6

أو من خلال التابع sum في نمباي:

a.sum()

أو من خلال استخدام التابع bicount من نمباي:

arr=np.array([False, True, True, True, False, True, False, True, True])
#false وعدد ال true سيقوم بحساب عدد ال
bin_arr = np.bincount(arr)
bin_arr # array([3, 6])
#True لاستخلاص عدد ال
bin_arr[1] # 6

للمقارنة:

a=np.array([[True,True,True,False,False]*100])
%timeit a[a].size
%timeit sum(a.ravel())
%timeit np.count_nonzero(a)
%timeit a.sum()
%timeit np.bincount(a.ravel())
"""
The slowest run took 23.84 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 5: 1.82 µs per loop
1000 loops, best of 5: 1.14 ms per loop
The slowest run took 19.70 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 5: 975 ns per loop
The slowest run took 27.08 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 5: 2.98 µs per loop
The slowest run took 67.31 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 5: 2.62 µs per loop
"""

 

تمّ تعديل بواسطة Ali Haidar Ahmad
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

لديك خيارات متعددة. خيارين كالآتي.

boolarr.sum()
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)

>>> boolarr.sum()
5

بالطبع ، هذه إجابة محددة ل  bool.

بشكل عام ، يمكنك استخدام  numpy.count_nonzero.

>>> np.count_nonzero(boolarr)
5

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن