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

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

Amer Abdallah

السؤال

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

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

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

[1, 2, 3, 1]

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

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

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

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

ValueError: arrays must have same number of dimensions

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

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

Recommended Posts

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

 

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

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

 

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

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

  • 0

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

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

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

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

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

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

 

تم التعديل في بواسطة عبدالباسط ابراهيم
خطأ إملائي
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...