• 0

كيفية حساب عدد تكرار القيم في المصفوفة Numpy؟

لنفترض أن لدي مصفوفة بسيطة تحتوي على عناصر مكررة كالتالي:

>>> import numpy as np
>>> x = np.array([1,1,1,2,2,2,5,25,1,1])
>>> freq_count(x)	# pseudo code
[(1, 5), (2, 3), (5, 1), (25, 1)]
>>>

كيف يمكنني الحصول على نفس النتيجة السابقة في Numpy؟

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

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


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

ألق نظرة على np.bincount في التوثيق.

import numpy as np
x = np.array([1,1,1,2,2,2,5,25,1,1])
y = np.bincount(x)
ii = np.nonzero(y)[0]

ومن ثم

zip(ii,y[ii]) 
# [(1, 5), (2, 3), (5, 1), (25, 1)]

أو

np.vstack((ii,y[ii])).T
# array([[ 1,  5],
         [ 2,  3],
         [ 5,  1],
         [25,  1]])

أو أو كما تريد دمج عدد التكرار مع القيم الفريدة .

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


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

هناك عدة طرق أولها استخدام التابع unique ثم zip كالتالي:

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

أو من خلال التابع Counter كالتالي :

import numpy as np
a = np.array([1,1,1,2,2,2,5,25,1,1])
import collections
collections.Counter(a)
# Counter({1: 5, 2: 3, 5: 1, 25: 1})

أو باستخدام bincount وهي الطريقة الأسرع، حيث تقوم هذه الطريقة بإعادة مصفوفة طولها بطول أكبر قيمة في مصفوفتك، أي إذا كانت 30 سيكون خرجها شعاع ب 30 عنصر بحيث كل index فيها يقابل تكرار الرقم الموافق له في بياناتك، أي مثلاً ال index رقم 1 في مصفوفة الخرج يقابل عدد مرات ظهور الرقم 1 في مصفوفتك:

import numpy as np
a = np.array([1,1,1,2,2,2,5,25,1,1])
print(np.bincount(a))
"""
[0 5 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]
"""

أو من خلالscipy.stats.itemfreq :

import numpy as np
a = np.array([1,1,1,2,2,2,5,25,1,1])
from scipy.stats import itemfreq
itemfreq(a)
"""
array([[ 1,  5],
       [ 2,  3],
       [ 5,  1],
       [25,  1]])
"""

وآخر حل من خلال pandas مع التابع stack من نمباي، كالتالي:

import numpy as np
a = np.array([1,1,1,2,2,2,5,25,1,1])
import pandas as pd
def pandas_value_counts(a):
    out = pd.value_counts(pd.Series(a))
    out.sort_index(inplace=True)
    out = np.stack([out.keys().values, out.values]).T
    return out
pandas_value_counts(a)
"""
array([[ 1,  5],
       [ 2,  3],
       [ 5,  1],
       [25,  1]])
"""

 

تمّ تعديل بواسطة Ali Haidar Ahmad

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


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

توجد العديد من الطرق لتنفيذ ذلك حيث في التعليقات السابقة تم استخدام unique  Counter  و bincount 

ولكن يمكنك استخدام pandas أيضاً كالتالي

>>> import pandas as pd
>>> import numpy as np
>>> x = np.array([1,1,1,2,2,2,5,25,1,1])
>>> pd.value_counts(x)
1     5
2     3
25    1
5     1
dtype: int64

 

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


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

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

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

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


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

تسجيل الدخول

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


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