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

السؤال

نشر

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

>>> 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؟

Recommended Posts

  • 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

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...