Fahmy Mostafa نشر 28 يوليو 2021 أرسل تقرير نشر 28 يوليو 2021 لدي مصفوفة من نوع 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؟ 1 اقتباس
2 Ali Haidar Ahmad نشر 29 يوليو 2021 أرسل تقرير نشر 29 يوليو 2021 (معدل) التابع 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) """ تم التعديل في 29 يوليو 2021 بواسطة Ali Haidar Ahmad 1 اقتباس
0 Wael Aljamal نشر 28 يوليو 2021 أرسل تقرير نشر 28 يوليو 2021 يمكننا الاعتماد على معاملات المقارنة مع الدالة sum لعد العناصر التي تحقق شرطا معيناً، حيث أن أي شرط يتم تقييمه true سيعطي 1 و أي شرط false يعطي 0.. لكني نقوم بعد العناصر التي تساوي 1 ببساطة نضع الشرط: print(np.sum (arr == 1)) أو حتى بدون sum print(arr == 1) ولكي نعد ال0 بنفس الطريقة. سبب الخطأ أن مصفوفة numpy لا تملك الدالة count 1 اقتباس
0 Ahmed Sharshar نشر 28 يوليو 2021 أرسل تقرير نشر 28 يوليو 2021 (معدل) يؤدي حساب تكرارات قيمة في مصفوفة 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] تم التعديل في 28 يوليو 2021 بواسطة Ahmed Sharshar 1 اقتباس
0 عبدالباسط ابراهيم نشر 28 يوليو 2021 أرسل تقرير نشر 28 يوليو 2021 توجد العديد من الطرق التي يمكنك من خلالها تنفيذ المطلوب مثل الدوال في التعليقات السابقة أو يمكنك من خلال الدالة 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}) 1 اقتباس
السؤال
Fahmy Mostafa
لدي مصفوفة من نوع ndarray كالتالي:
عندما أحاول حساب عدد مرات تكرار رقم 0 أو 1 كالتالي:
يظهر لي الخطأ التالي:
لماذا يظهر هذا الخطأ؟ وكيف أقوم بحساب عدد مرات تكرار عنصر معين في مصفوفة Numpy؟
4 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.