• 0

إضافة عنصر واحد إلى مصفوفة في numpy

لدي مصفوفة عددية تحتوي على:

arr = np.array([1, 2, 3])

أريد إنشاء مصفوفة تحتوي على:

[1, 2, 3, 1]

وهذا يعني أنني أريد إضافة العنصر الأول إلى نهاية المصفوفة.

لقد جربت الحل التالي:

np.concatenate((arr, arr[0]))

لكن ظهر لي الخطأ التالي:

ValueError: arrays must have same number of dimensions

لا أفهم لماذا ظهر هذا الخطأ، كلا المصفوفتان أحادية البعد 1d.

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

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


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

حسناً دعنا نناقش كل شيء بشكل منفصل. أولاً دعني أعرفك كيف تقوم بإضافة عنصر أو عدة عناصر لمصفوفة في نمباي. أولاً لإضافة عنصر في نهاية القائمة نستخدم الدالة append كالتالي:

# numpy.append(arr, values, axis=None)  شكل الدالة 
# أول وسيط هو المصفوفة
# ثاني وسيط هو القيمة
# الثالث هو المحور الذي نريد إضافة العنصر له
# تعيد هذه الدالة نسخة من المصفوفة تحوي العنصر أو العناصر المضافة
import numpy as np
a=np.array([1,2,3])
a=np.append(a,1)
a
# array([1, 2, 3, 1])
# لإضافة أكثر من عنصر
a=np.append(a,[2,3])
a
# array([1, 2, 3, 1, 2, 3])
# الآن لو جربنا إضافة مصفوفة ثنائية الأبعاد لها
np.append(a,[[4, 5, 6], [7, 8, 9]])
# array([1, 2, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# لاحظ كيف قام بتسطيح المصفوفة الثنائية ثم أضافها للمصفوفة وذلك لأننا لم نحدد له المحور
# الآن سنحدد له المحور
a
# array([1, 2, 3, 1, 2, 3])
np.append(a,[[4, 5, 6], [7, 8, 9]],axis=0) # ValueError: all the input arrays must have same number of dimensions
# أعطى خطأ لأن المصفوفتين يجب أن يكون لهما أبعاد متسقةأي نحن نريد أن نضيف المصفوفة الثنائية إلى المصفوفة الأصلية على المحور العمودي وبالتالي يجب أن تتطابق أبعاد الأعمدة
# انظر
arr=[[1, 2, 3], [4, 5, 6]]
np.append([[1, 2, 3], [4, 5, 6]],[ [7, 8, 9]],axis=0)
"""
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
"""

الآن لو أردت إضافة عنصر في فهرس محدد من المصفوفة (أي أي مكان تريده في البداية أو النهاية أو الوسط ..) يمكنك استخدام الدالة insert:

#numpy.insert(arr, obj, values, axis=None)
import numpy as np
#obj هو الفهرس أو الفهارس التي تريد أن تتم الإضافة عندها
# تعيد نسخة أيضاً
# مثلا تريد إضافة عنصر لنهاية المصفوفة
a = np.asarray([1,2,3])
a=np.insert(a, 3, 1)
a
# array([1, 2, 3, 1])
# إذا كنت لاتعرف الفهرس الخاص بآخر عنصر
a = np.asarray([1,2,3])
np.insert(a, len(a), 1) # len(a)=3 حيث ترد لك عدد العناصر في المصفوفة
# array([1, 2, 3, 1])
##########################  مثال آخر ########################
a = np.array([[1, 1], [2, 2], [3, 3]])
a
"""
array([[1, 1],
       [2, 2],
       [3, 3]])
"""
#append هنا لم نحدد له المحور وبالتالي الإضافة تكون كما في 
np.insert(a, 1, 5)
# array([1, 5, 1, 2, 2, 3, 3])
# هنا حددنا المحور الأفقي
np.insert(a, 1, 5, axis=1)
"""
array([[1, 5, 1],
       [2, 5, 2],
       [3, 5, 3]])
"""
#brodcasting لاحظ كيف تم تنفيذ عملية نسخ وهذه عملية نسميها 
# الآن لاحظ حالة ثانية عندما نحدد أكثر من قيمة أي نريد أن  نضيف عدة قيم في الفهرس1 على طول المحور 
np.insert(a, [1], [[1],[2],[3]], axis=1)
"""
rray([ [1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])
"""

استخدام الدالة concatenate لهكذا أمر هو تكنيك غير شائع فالدالتين السابقتين ستغنينك عن أي طريثة أخرى، لكنني سأوضح لك استخدامها:

# numpy.concatenate((a1, a2, ...), axis=0)
# ربط سلسلة من المصفوفات على طول محور موجود
# (a1, a2, ...) تسلسل من المصفوفات
# يجب أن يكون للمصفوفات نفس الشكل ، إلا في البعد المقابل للمحور (الأول ، افتراضيًا)
a1 = np.array([[1, 2], [3, 4]]) # shape: 2*2
"""
array([[1, 2],
       [3, 4]])
"""
a2 = np.array([[5, 6]]) # shape: 1*2
# الأبعاد متناسقة إذا أردنا إضافة المصفوفة الثانية للأولى على المحور العمودي
np.concatenate((a1, a2), axis=0)
"""
array([[1, 2],
       [3, 4],
       [5, 6]])
"""
# على المحور الأفقي الأبعاد غير متناسقة وبالتالي سيظهر خطأ لو حاولنا الإضافة لذا يجب أن نقوم بتعديل أبعاد المصفوفة وهذا سهل في حالتنا
a2=a2.T # shape: 2*1
a2
"""
array([[5],
       [6]])
"""
np.concatenate((a1, a2), axis=1)
"""
array([[1, 2, 5],
       [3, 4, 6]])
"""
####################################################

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

type(a[0]) # numpy.int64 وهي ماتعتبر أبعاد صفرية وبالتالي لن ينجح في مطابقة الأبعاد وسيعطيك خطأ بأن الأبعاد غير متجانسة
# لذا الحل
np.concatenate((a, np.array([a[0]])))
#array([1, 2, 3, 1])

 

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

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


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

يمكن استخدام numpy.insert ولكنه يعيد مصفوفة جديدة لأن المصفوفات في numpy لها طول ثابت..

>>> import numpy as np
>>> a = np.asarray([1,2,3])

>>> np.insert(a, 3, 1) 
array([ 1,  2,  3,  1])

insert يأخذ وسيطين، دليل العنصر بالمكان الذي نريد حشره ثم قيمته..

إن كنت تريد استخدام concatenate فهي تتعامل مع المصفوفات، لذلك عليك تمرير أجزاء المصوففة الثابتة و بينها العناصر الجديدة في مصفوفة خاصة

np.concatenate((arr, [ arr[0] ] ))
                    ^^^      ^^^

لاحظ إحاطة العنصر المضاف بين أقواس مصفوفة

الشكل العام لها .. 

np.concatenate((a[:index], [value], a[index:]))

إن أردت حشر العنصر في آخر المصفوفة يمكن استخدام الدالة append:

import numpy as np
arr = np.array([1, 2, 3])
arr = np.append(arr,1)

print(arr) # [1 2 3 1]

 

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

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


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

يمكنك استخدام الدالة numpy.insert ، انظر المثال التالي للتوضيح:

a = np.array([[1, 1], [2, 2], [3, 3]])
a
>>> array([[1, 1],
    	   [2, 2],
       	   [3, 3]])

np.insert(a, 1, 5)
>>> array([1, 5, 1, ..., 2, 3, 3])

لاحظ ان الدالة تقوم بأخذ ثلاث قيم، اولا المصفوفة التي تريد الاضافة اليها، ثم موقع العنصر الذي تريد اضافته ، في المثال السابق مثلا كان موقع العنصر هو 1 لذا قام باضافته في المكان الثاني لانه يبدأ العد من 0، واخيرا ياخذ قيمة العنصر الذي تريد اضافته وفي المثال السابق كان 5.

لاحظ انه يمكنك اضافته في اي مكان سواءكان صفا او عمود، انظر المثال التالي:
 

a = np.array([[1, 1], [2, 2], [3, 3]])
np.insert(a, 1, 5, axis=1)
array([[1, 5, 1],
       [2, 5, 2],
       [3, 5, 3]])

لاحظ ان وضع axis=1 يقوم باضفة العنصر في مكانه بالاعمدة وليس الصفوف، اما axis=0 وهي القيمه الافتراضيه يقوم باعتبار المصفوفة كانها صف ويقوم بتحديد مكان العنصر المراد اضافته على هذا الاساس

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

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


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

يجب عليك فهم الخطأ أولاً

[0]arr ليست مصفوفة، بل هي العنصر الأول من arr وبالتالي ليس لها أي أبعاد.

حاول استخدام [0:1] بدلا من ذلك ، الذي سيعيد العنصر الأول من داخل lلمصفوفة صنف واحد واستخدام .np.concatenate بشكل طبيعي

np.concatenate((arr, arr[0:1]))

أو يمكنك تحويل العنصر [0]arr لمصفوفة 

np.concatenate((arr, np.array([arr[0]])))

 

تمّ تعديل بواسطة عبدالباسط ابراهيم
خطأ إملائي
1 شخص أعجب بهذا

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


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

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

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

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


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

تسجيل الدخول

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


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