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

السؤال

نشر

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

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

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

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

Recommended Posts

  • 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
  • 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]

 

  • 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])

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...