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

كيف نحسب عدد مرات تكرار عنصر معين في ndarray في مكتبة Numpy؟

Fahmy Mostafa

السؤال

لدي مصفوفة من نوع ndarray كالتالي:

arr = numpy.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])

عندما أحاول حساب عدد مرات تكرار رقم 0 أو 1 كالتالي:

arr.count(0)

يظهر لي الخطأ التالي:

AttributeError: 'numpy.ndarray' object has no attribute 'count'

لماذا يظهر هذا الخطأ؟ وكيف أقوم بحساب عدد مرات تكرار عنصر معين في مصفوفة Numpy؟

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

Recommended Posts

  • 2

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

a = np.arange(10)
a=np.array([0, 11, 11, 3, 4, 11, 6, 7, 8, 9])
serach=11
list(a).count(serach) # 3

لكن هذه الطريقة يمكنك استخدامها فقط في حالة كانت مصفوفتك أحادية الأبعاد. أما في حالة كانت مصفوفتك متعددة الأبعاد فيمكنك اسخدام خدعتي السحرية لحل المشكلة، وهي استخدام التابع reshape لتحويل المصفوفة من مصفوفة متعددة الأبعاد ثم استخدام التايع count معها:

a = np.arange(10)
a=np.array([[8, 9],[8, 8]])
a=a.reshape(-1)
serach=8
list(a).count(serach) # 3

ويمكنك استخدام التابع np.bincount(a) أيضاً بنفس الطريقة (هذا التايع أيضاً يقوم بحساب التكرار للمصفوفات أحادية الأبعاد فقط، وبالتالي نستخدم نفس التكتيك السابق لحل المشكلة) حيث يعيد لك تكرارات كل العناصر:

a = np.arange(10)
a=np.array([[8, 9],[8, 8]])
a=a.reshape(-1)
print(a) # [8 9 8 8]
serach=8
np.bincount(a) # array([0, 0, 0, 0, 0, 0, 0, 0, 3, 1], dtype=int64)

إن مايميز هذا التابع هو سرعته الغير قابلة للمقارنة ببقية الطرق. وأيضاً يمكنك استخدام التابع Counter ينفس الأسلوب، حيث تعيد قاموس بكل قيمة وتكراراتها:

a = np.arange(10)
a=np.array([[8, 9],[8, 8]])
a=a.reshape(-1)
print(a) # [8 9 8 8]
from collections import Counter
Counter(a) # Counter({8: 3, 9: 1})

وأيضاً يمكنك استخدام التابع count_nonzero :

a = np.arange(10)
a=np.array([[8, 9],[8, 8]])
np.count_nonzero(a == 8) # 8
a = np.zeros((3,2,2))
np.count_nonzero(a == 0) # 12

أو من خلال np.sum :

a = np.array([3,4,5,5,6])
np.sum(a == 5) # 2

أو من خلال التابع unique ثم zip:

a = np.array([3,4,5,5,6])
unique, counts = np.unique(a, return_counts=True)
dict(zip(unique, counts))
# {3: 1, 4: 1, 5: 2, 6: 1}

مايلي هو مقارنة في السرعة بين التحقيقات السابقة:

choices = np.random.randint(0, 100, 10000)
%timeit [ np.sum(choices == k) for k in range(min(choices), max(choices)+1) ]
%timeit np.unique(choices, return_counts=True)
%timeit np.bincount(choices, minlength=np.size(choices)) # الأفضل
%timeit  [ np.count_nonzero(choices == k) for k in range(min(choices), max(choices)+1) ]
%timeit [ list((choices.reshape(-1))).count(k) for k in range(min(choices), max(choices)+1) ]
%timeit Counter(((choices.reshape(-1))))

"""
8.04 ms ± 801 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
596 µs ± 88 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
44.5 µs ± 5.52 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
5.02 ms ± 429 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
390 ms ± 21.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.66 ms ± 166 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
"""

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكننا الاعتماد على معاملات المقارنة مع الدالة sum لعد العناصر التي تحقق شرطا معيناً، حيث أن أي شرط يتم تقييمه true سيعطي 1 و أي شرط false يعطي 0..

لكني نقوم بعد العناصر التي تساوي 1 ببساطة نضع الشرط:

print(np.sum (arr == 1))

أو حتى بدون sum

print(arr == 1)

ولكي نعد ال0 بنفس الطريقة.

سبب الخطأ أن مصفوفة numpy لا تملك الدالة count

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

  • 0

يؤدي حساب تكرارات قيمة في مصفوفة NumPy إلى إرجاع تكرار القيمة في المصفوفة. على سبيل المثال ، في [1 ، 2 ، 3 ، 2 ، 1 ، 2] ، فإن 2 تظهر ثلاث مرات.

استخدم ()np.count_nonzero  لحساب عدد المرات التي تظهر بها قيمة معينة.

ويمكن استدعائها كالتالي:

np.count_nonzero(array == value)

حيث تضع value بالرقم الذي تريد أن تبحث عن عدد مرات تكراره.

كمثال يمكن انشاء المصفوفة التالية:

arr = numpy.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])

ثم نستدعى الدالة كالتالي:

occurrences = np.count_nonzero(arr == 1)
print(occurrences)

يكون الناتج = 4.

يمكنك كذلك البحث في مصفوفة من صفوف وأعمدة بأستخدام نفس الدالة كالتالي:

 np.count_nonzero(array == value, axis=n)

حيث أن axis هو اما الصف أو العمود الذي نريد البحث فيه، فمثلا لو n=1 فسيقوم بحساب تكرارات القيمة في كل صف. واذا كانت n=0 فسيقوم بحساب تكرارات القيمة في كل عمود.

مثال، دعنا ننشأ المصفوفة التالية:

arr = numpy.array( [1, 2, 3, 2, 1, 2])

ثم نكتب الكود التالي:

row_occurrences = np.count_nonzero(an_array == 2, axis=1)
print(row_occurrences)

ويكون الخرج من تشغيله كالتالي:

[1 2]

 

تم التعديل في بواسطة Ahmed Sharshar
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

توجد العديد من الطرق التي يمكنك من خلالها تنفيذ المطلوب مثل الدوال في التعليقات السابقة أو يمكنك من خلال

  • الدالة numpy.unique كالتالي
    a = numpy.array([0, 3, 0, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 3, 4])
    unique, counts = numpy.unique(a, return_counts=True)
    dict(zip(unique, counts)) #يحتوي على العنصر وعدد مرات التكرار dict لإنشاء 
    
    # {0: 7, 1: 4, 2: 1, 3: 2, 4: 1}

     

  • أو يمكنك استخدام الدالة  collections.Counter 

    import collections, numpy #collections لا تنسى استدعاء ال 
    a = numpy.array([0, 3, 0, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 3, 4])
    collections.Counter(a)
    
    # Counter({0: 7, 1: 4, 3: 2, 2: 1, 4: 1})

     

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...