Amer Abdallah نشر 13 أغسطس 2021 أرسل تقرير نشر 13 أغسطس 2021 لدي مصفوفة عددية تحتوي على: 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 اقتباس
0 Wael Aljamal نشر 14 أغسطس 2021 أرسل تقرير نشر 14 أغسطس 2021 يمكن استخدام 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 Ahmed Sharshar نشر 14 أغسطس 2021 أرسل تقرير نشر 14 أغسطس 2021 (معدل) يمكنك استخدام الدالة 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 وهي القيمه الافتراضيه يقوم باعتبار المصفوفة كانها صف ويقوم بتحديد مكان العنصر المراد اضافته على هذا الاساس تم التعديل في 14 أغسطس 2021 بواسطة Ahmed Sharshar 1 اقتباس
0 عبدالباسط ابراهيم نشر 14 أغسطس 2021 أرسل تقرير نشر 14 أغسطس 2021 (معدل) يجب عليك فهم الخطأ أولاً [0]arr ليست مصفوفة، بل هي العنصر الأول من arr وبالتالي ليس لها أي أبعاد. حاول استخدام [0:1] بدلا من ذلك ، الذي سيعيد العنصر الأول من داخل lلمصفوفة صنف واحد واستخدام .np.concatenate بشكل طبيعي np.concatenate((arr, arr[0:1])) أو يمكنك تحويل العنصر [0]arr لمصفوفة np.concatenate((arr, np.array([arr[0]]))) تم التعديل في 14 أغسطس 2021 بواسطة عبدالباسط ابراهيم خطأ إملائي 1 اقتباس
1 Ali Haidar Ahmad نشر 14 أغسطس 2021 أرسل تقرير نشر 14 أغسطس 2021 حسناً دعنا نناقش كل شيء بشكل منفصل. أولاً دعني أعرفك كيف تقوم بإضافة عنصر أو عدة عناصر لمصفوفة في نمباي. أولاً لإضافة عنصر في نهاية القائمة نستخدم الدالة 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 اقتباس
السؤال
Amer Abdallah
لدي مصفوفة عددية تحتوي على:
أريد إنشاء مصفوفة تحتوي على:
وهذا يعني أنني أريد إضافة العنصر الأول إلى نهاية المصفوفة.
لقد جربت الحل التالي:
لكن ظهر لي الخطأ التالي:
لا أفهم لماذا ظهر هذا الخطأ، كلا المصفوفتان أحادية البعد 1d.
4 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.