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

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

Amer Abdallah

السؤال

كيف أقوم بحذف عناصر من مصفوفة 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؟ وهل يجب أن أقوم بحذف كل عنصر على حدى (أي هل يمكن حذف عدد من العناصر معًا)؟

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

Recommended Posts

  • 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
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

اقتباس

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

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

 

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

  • 0

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

  • slicing:
    a = a[i:j]

     

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

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

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...