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

السؤال

نشر

لدي مصفوفة من نوع 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...