• 0

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

لنفترض أن لدي مصفوفة NumPy كالتالي:

a = np.array([1,2,3,1,2,1,1,1,3,2,2,1])

كيف يمكنني العثور على الرقم الأكثر تكرارا في هذه المصفوفة؟

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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 للأكثر تكرارا ونمرر الترتيب الأول لأكثر عنصر

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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 مرات وهكذا.

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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]

 

انشر على الشّبكات الاجتماعية


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

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن