• 0

إستخدام كل عناصر مصفوفة ما عدا عنصر معين في Numpy؟

هل هناك طريقة بسيطة لفهرسة جميع عناصر  المصفوفة باستثناء فهرس معين؟ فبفرض أني أريد أن أقوم بإستخدام كل عناصر مصفوفة معينة بإستثناء العنصر رقم 3 مثلُا، كيف يمكنني أن أقوم بذلك؟

mylist[3] # يقوم بإرجاع العنصر الموجود في الفهرس 3

# لكن هل يوجد شيء كاتاليب
milist[~3] # يقوم بإرجاع كل المصفوفة ما العنصر الموجود في الفهرس 3

هل توجد طريقة في مكتبة Numpy تقوم بهذا الأمر أم علي أن أقوم بعمل مصفوفة جديدة تحتوي على كل العناصر ما عدا عنصر 

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

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


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

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

import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
a
# array([1, 2, 3, 4, 5, 6, 7, 8, 9])
#للعنصر الذي نريده أن يظهر True  ننشئ قناع بالحجم الذي نريده ونضع 
mask=[True,True,True,True,True,False,True,True,True]
#False الآن ستظهر كل عناصر المصفوفة ماعدا العنصر الذي وضعنا له  
a[mask]
#array([1, 2, 3, 4, 5, 7, 8, 9]) # 6 غير موجودة

حسناً هناك طريقة أكثر راحة لإنشاء القناع كالتالي:

import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
a
# array([1, 2, 3, 4, 5, 6, 7, 8, 9])
mask = np.ones(a.shape, bool)
mask
# array([ True,  True,  True,  True,  True,  True,  True,  True,  True])
a[mask]
#array([1, 2, 3, 4, 5, 6, 7, 8, 9])

الآن يمكننا تطبيق الفكرة السابقة لاستبعاد أي فهرس نريده:

#فقط في القناع  False الآن لو أردنا استبعاد عنصر نقوم بوضع 
# مثلاً أريد استبعاد الفهرس 6
exclude=5
mask[exclude] = False
a[mask]
# array([1, 2, 3, 4, 5, 7, 8, 9])

هناك طريقة أخرى وهي الأسهل وتتمثل باستخدام الدالة delete حيث نمرر لها فهرس العنصر المراد استبعاده، وطبعاً لاتؤثر على العنصر الفعلي الموجود في المصفوفة لأن هذه الدالة ترجع نسخة من المصفوفة وبالتالي التعديل لايتم على المصفوفة الأصلية:

import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
a
# array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# مثلاً أريد استبعاد الفهرس 6
exclude=6
np.delete(a, exclude)
# array([1, 2, 3, 4, 5, 6, 8, 9])

كذلك يمكنك استخدام np.isin ، لتوليد القناع، لكن دعنا نفهم ماتقوم به هذه الدالة أولاً:

import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
a
# array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# numpy.isin(element, test_elements)
#في مكان العنصر المراد  True هذه الدالة تأخذ مصفوفة + العنصر المراد البحث عنه، وخرجها يكون مصفوفة بنفس الأبعاد لكن تضع 
#في باقي الأماكن False و
np.isin(a, 6)
# array([False, False, False, False, False,  True, False, False, False])
# وبالتالي لو قمنا بعملية نفي على قيم المصفوفة سيكون الخرج
~np.isin(a, 6)
# array([ True,  True,  True,  True,  True, False,  True,  True,  True])
# وهذه الفكرة سنستخدمها لإنشاء القناع

والحل يكون خطوة بخطوة:

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
a
# array([1, 2, 3, 4, 5, 6, 7, 8, 9])
b=np.ones(len(a))
# array([1., 1., 1., 1., 1., 1., 1., 1., 1.])
# مثلاً أريد استبعاد الفهرس 6
exclude=6
# أحول المصفوفة السابقة لقناع بولياني
~np.isin(b, exclude)
# array([ True,  True,  True,  True,  True,  True, False,  True,  True])
a[~np.isin(b, exclude)]
# array([1, 2, 3, 4, 5, 6, 8, 9])
# واختصاراً
# a[~np.isin(np.arange(len(a)), exclude)]

وبنفس الطريقة نستخدم np.in1d:

import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
a
# array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# مثلاً أريد استبعاد الفهرس 6
exclude=6
a[~np.in1d(np.arange(len(a)), exclude)]
# array([1, 2, 3, 4, 5, 6, 8, 9])

 

تمّ تعديل بواسطة Ali Haidar Ahmad
1 شخص أعجب بهذا

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


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

الحل بسيط، قم بانشاء المصفوفة بعد ذلك استخدم الدالة numpy.delete، لا تقلق فهي لا تقوم بحذف عنصر من المصفوفة فقط استبعاده مؤقتا.

انظر المثال التالي، قم باشناء مصفوفة بالطريقة العادية كالتالي:

import numpy as np
x = np.array([0,10,20,30,40,50,60])

قم بتحديد العنصر او العناصر التي تريد استبعادها، هنا ان تحدد مكان العناصر التي تريد ازالتها index وليس قيمة العنصر نفسه  كالتالي:

exclude = [1, 3, 5]

بعد ذلك استخدم الدالة delete كالتالي:

In [4]: np.delete(x, exclude)
Out[4]: array([ 0, 20, 40, 60])

لاحظ انه تم استبعاد العناصر في الاماكن التي حددناها سابقا  [1,3,5] لذا استبعد [10,30,50].

تمّ تعديل بواسطة Ahmed Sharshar

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


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

يمكننا توليد مصفوفة من مواقع العناصر المطلوبة ثم أخذ هذه المصفوفة ك indexes للمصفوفة الهدف:

a[np.arange(len(a))!=3]
array([0, 1, 2, 4, 5, 5, 6, 7, 8, 9])

المصفوفة الأصلية فيها الأعداد من  0 حتى 9 (تم تخطي 3)

ويمكن استعمال concatenate :

np.concatenate((x[:i],x[(i+1):]))
array([0, 1, 2, 4, 5, 6, 7, 8, 9])

حيث i هي الدليل المستبعد أي 3.

كما يمكن استعمال  masked array لتحديد العناصر التي لانريدها 

a = np.ma.array(a, mask=False) # الافتراضي False
a.mask[3] = True               # المستبعد
print(a)
# [0 1 2 -- 4 5 5 6 7 8 9]

 

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

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


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

كما ترى في التعليقات فإنه توجد العديد من الطرق لتنفيذ المطلوب فمثلاً

يمكنك استخدام for loop كالتالي

 x[[z for z in range(x.size) if not z in exclude]]

قم بتحديد ال exclude من خلال list تحتوي على جميع العناصر التي لا تريدها

كما يمكنك استخدام hstack كما في المثال التالي

a = [0,1,2,3,4,5,5,6,7,8,9]

np.hstack((a[:3], a[4:]))
#قم بتحديد المقطع الذي تريد حذفه

array([0, 1, 2, 4, 5, 5, 6, 7, 8, 9])

 

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

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


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

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

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

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


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

تسجيل الدخول

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


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