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

كيفية البحث عن الرقم الأكثر شيوعًا في مصفوفة Numpy؟

Amer Abdallah

السؤال

Recommended Posts

  • 1

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

import numpy as np
array = np.array([2, 9, 7, 10,3, 5, 3])
count=np.bincount(array)
count
# array([0, 0, 1, 2, 0, 1, 0, 1, 0, 1, 1])
# لاحظ أنه يعيد مصفوفة عدد عناصرها يساوي أكبر عنصر في المصفوفة 
# مثلاً في مصفوفتنا السابقة أكبر عنصر هو 10 وبالتالي سيكون حجم المصفوفة الناتجة10
# من المصفوفة الناتجة نستنتج أن العنصر الأكثر ظهوراً هو 3 حيث أن القيمة التي تقابل الفهرس 3 تساوي 2 في المصفوفة الناتجة أي أنه ظهر مرتين

الآن يمكننا استخدام النتيجة التي حصلنا عليها من هذا التابع لمعرفة العنصر ذو أعلى تردد (الأكثر ظهوراً) ضمن المصفوفة وذلك من خلال التابع Argmax حيث يرد هذا التابع فهرس العنصر الأكبر، وفي المصفوفة count فإن العنصر الأكبر هو 2 وهو يقابل الفهرس 3 وهو يقابل أو يمثل القيمة 3 في المصفوفة Array:

count.argmax() # 3

لكن مهلاً، بفرض كان هناك عنصران لهم أعلى ظهور ماذا سيحدث؟

import numpy as np
array = np.array([2, 9, 7, 10,3,2, 5, 3])
count=np.bincount(array)
count
# array([0, 0, 2, 2, 0, 1, 0, 1, 0, 1, 1])
count.argmax() # 2 !!! لن يعطيك سوى قيمة وحيدة 

لاحظ أن العنصر 3 و العنصر 2 ظهرا مرتين لكن بهذه الطريقة لن نحصل إلا على قيمة واحدة. لذا الحل يكون كالتالي:

maximum = max(count) #count نحسب القيمة الأكبر في مصفوفة ال 
#وكلما رأينا القيمة 2 نطبع الفهرس المقابل لها count نمرر حلقة على مصفوفة ال
for i in range(len(count)):
    if count[i] == maximum:
        print(i, end=" ")
# 2 3

الآن يجب أن تضع في حسبانك أن هذه الدالة تعمل فقط مع الأعداد، فماذا بشأن ال string وغيرها؟؟... هنا يأتي دور الدالة counter، كما ويمكنها حل مشكلتك مع الأرقام كالتالي:

from collections import Counter
array = np.array([2, 9,9, 7, 10,3, 5, 3])
array
# array([ 2,  9,  9,  7, 10,  3,  5,  3])
# ترد هذه الدالة قاموس مفاتيحه هي العناصر وقيمها هي عدد مرات الظهور
c = Counter(array)
c
# Counter({2: 2, 3: 2, 5: 1, 7: 1, 9: 1, 10: 1})
#مرتبة بحيث تكون العناصر الأكثر تكراراً في البداية tuble نطبق عليها الدالة التالية والتي تقوم بتحويلها إلى قائمة من ال
freq=c.most_common()
print (freq)
# [(9, 2), (3, 2), (2, 1), (7, 1), (10, 1), (5, 1)]
# والآن يمكنك استخراجها بسهولة
freq[0][0] # 9
# إذا أردنا إظهار 3 أيضاً
for i in range(0,len(freq)):
  if freq[i][1]==freq[0][1]:
    print(freq[i][0], end=" ")
# 9 3 

هناك طريقة أخرى وهي استخدام Mode من scipy.stats وكما نعلم فإن ال Mode هو العنصر الأكثر تكراراً:

from scipy import stats as s
array = np.array([2, 9, 7, 10,3, 5, 3])
print(s.mode(array)[0])
# 3
# لكن في حالة وجدت قيمتين سيعطيك الخطأ التالي
array = np.array([2, 9,9, 7, 10,3, 5, 3])
print(s.mode(array)[0]) # [3]

 

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

  • 0

إن كانت جميع القيم في المصفوفة موجبة يمكن استخدام numpy.bincounts لحساب تكرار كل عدد ثم نطبق على ناتجه الدالة argmax:

arr = np.array([1,2,3,1,2,1,1,1,3,2,2,1])
myCounter = np.bincount(arr)
print(np.argmax(myCounter))

كما يمكن استخدام np.histogram :

np.histogram([[1, 2, 1], [1, 0, 1]], bins=[0,1,2,3])
(array([1, 4, 1]), array([0, 1, 2, 3]))

bins هي العتبات التي سيتم حساب التكرار عندها، و np.histogram  تعيد مصفوفة تحوي تكرار كل قيمة موافقة للعتبات bins للعنصر المقابل لها

كما يمكن استخدام collections.Counter من بايثون:

from collections import Counter
a = [1,2,3,1,2,1,1,1,3,2,2,1]
b = Counter(a) 
print(b.most_common(1))

حيث b يحمل تعداد التكرارات، ثم نطبيق الدالة most_common للأكثر تكرارا ونمرر الترتيب الأول لأكثر عنصر

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

  • 0

دعنا نقوم بانشاء مصفوفة بشكل عشوائي كالتالي:

import numpy as np
x = np.random.randint(0, 10, 30)
print(x)

output
>>> [9 8 3 8 6 0 8 0 9 5 1 2 9 3 4 4 9 4 5 8 6 6 6 6 9 4 8 6 2 0]

يمكننا استخدام الدالة  bincount( ).argmax( ) والتي تعطينا اكثر رقم تكرر في هذة المصفوفة كالتالي:

print(np.bincount(x).argmax())

output
>>> 6

هنا قام بارجاع الرقم 6 لانه الاكثر تكرارا في المصفوفة التي انشأناها.

كذلك يمكننا استخدام الدالة counter وذلك لاعطاءنا كل رقم في المصفوفة وعدد مرات تكراره على شكل tuple مرتبة تنازليا كالتالي:

from collections import Counter
b = Counter(x)
print (b.most_common())

output
>>> [(6, 6), (9, 5), (8, 5), (4, 4), (0, 3), (3, 2), (5, 2), (2, 2), (1, 1)]

هنا قامت الدالة بارجاع كل رقم في المصفوفة وبجواره عدد مرات تكراره، فمثلا الرقم 9 تم تكراره 5 مرات وهكذا.

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

  • 0

توجد العديد من الطرق المستخدمة سواء باستخدام python أو numpy  مثل استخدام numpy.bincounts أو collections.Counter كما يمكنك أيضاً استخدام np.unique كالتالي

values, counts = np.unique(a, return_counts=True)

ind = np.argmax(counts)
print(values[ind])  # طباعة الرقم الأكثر تكراراً

يمكنك أيضاً استخدام statistics.mode بداية من Python 3.4 

from statistics import mode

mode([1, 2, 3, 1, 2, 1, 1, 1, 3, 2, 2, 1])
# 1

وإذا كان هناك عدة عناصر بنفس التكرار وتريد إرجاعهم جميعاً نستخدم  statistics.multimode

from statistics import multimode

multimode([1, 2, 3, 1, 2])
# [1, 2]

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...