• 0

كيفية إزالة عناصر محددة في مصفوفة Numpy

كيف أقوم بحذف عناصر من مصفوفة Numpy، لدي مصفوفة بسيطة كالتالي:

>>> import numpy as np
>>> arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])

حاولت أن أستعلم جملة del كالتالي:

>>> del arr[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: cannot delete array elements
>>>

لكن كما هو واضح، ظهر لي خطأ من نوع ValueError، كيف أقوم بحذف العناصر من مصفوفات Numpy؟ وهل يجب أن أقوم بحذف كل عنصر على حدى (أي هل يمكن حذف عدد من العناصر معًا)؟

2 اشخاص أعجبوا بهذا

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


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

del تستخدم مع القوائم وليس مصفوفات نمباي على ما اعتقد، لذالك يظهر الخطأ. هناك عدة طرق للحذف من نمباي، فيمكنك استخدام التابع setdiff1d من نمباي، حيث نمرر له المصفوفة الأصلية والقيم التي نريد حذفها موضوعة ضمن مصفوفة:

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# مصفوفة بالقيم التي نريد حذفها
b = np.array([1,2,4])
arr = np.setdiff1d(arr,b)
arr
# array([3, 5, 6, 7, 8, 9])

أو من خلال التابع delete لكن هنا نمرر له ال index المراد حذفها وليس القيم:

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
b = np.delete(arr, [2,3,6]) #index هنا نمرر له ال 
b #array([1, 2, 5, 6, 8, 9])
# لحذف عنصر واحد من خلال الفهرس
array = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
index = 2
array = np.delete(array, index)
array
# array([ 10,  20,  40,  50,  60,  70,  80,  90, 100])

أيضاً هنا يتم الحذف من خلال تحديد الفهرس عن طريق استخدام itertools.compress وهي الطريقة الأسرع:

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
import itertools
index=[2,3,6]
arr = np.array(list(itertools.compress(arr, [i not in index for i in range(len(arr))])))
arr
# array([1, 2, 5, 6, 8, 9])

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

array = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
array.remove(40)
#[10, 20, 30, 50, 60, 70, 80, 90, 100]

أو pop لحذف عنصر من خلال تمرير ال index:

array = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
index = 2
array.pop(index)
array
# [10, 20, 40, 50, 60, 70, 80, 90, 100]

أو من خلال del وأيضاً من خلال ال index:

array = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
index = 2
del array[index]
array
# [10, 20, 40, 50, 60, 70, 80, 90, 100]

 

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

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


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

يمكنك استخدام دالة استخدم numpy.delete ()

numpy.delete(a, index)

لسؤالك المحدد:

import numpy as np

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = [2, 3, 6]

new_a = np.delete(a, index)

print(new_a) # `يطبع `[1, 2, 5, 6, 8, 9]

لاحظ أنه numpy.delete() يُرجع مصفوفة جديدة نظرًا لأن المصفوفة غير قابل للتغيير ، مثل السلاسل النصية في Python ، لذلك في كل مرة يتم إجراء تغيير عليها ، يتم إنشاء كائن جديد :

من توثيق delete()

اقتباس

" نسخة جديدة من المصفوفة مع العناصر المحددة بالكائن التي لم يتم حذفها.

ملاحظة أن الحذف لا يكون في نفس المكان.

 

2 اشخاص أعجبوا بهذا

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


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

بالإضافة للطريقة الأولى، يمكن استعمال:

  • slicing:
    a = a[i:j]

     

  • تمرير مصفوفة ب indexes لاستخلاص العناصر المطلوبة:
    a = a[[1, 2, 3, ...]]

    بهتين الطريقتين يمكن حذف مجال (مستمر أو متقطع من العناصر في مصفوفة ما)

2 اشخاص أعجبوا بهذا

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


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

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

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

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


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

تسجيل الدخول

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


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