اذهب إلى المحتوى

السؤال

نشر

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

Recommended Posts

  • 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

 

  • 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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...