Fahmy Mostafa نشر 1 أغسطس 2021 أرسل تقرير نشر 1 أغسطس 2021 لدي مصفوفتان Numpy بسيطتان أحادي البعد one-dimensional. حاولت أن أقوم بربطهم باستخدام التابع numpy.concatenate كالتالي: >>> import numpy as np >>> a = np.array([1, 2, 3]) >>> b = np.array([4, 5]) >>> np.concatenate(a, b) لكنني تلقيت هذا الخطأ التالي: TypeError: only integer scalar arrays can be converted to a scalar index لماذا يظهر هذا الخطأ؟ وكيف يمكنني ربط المصفوفتان معًا؟ 1 اقتباس
0 محمد أبو عواد نشر 1 أغسطس 2021 أرسل تقرير نشر 1 أغسطس 2021 يجب تعديل السطر التالي np.concatenate(a, b) ليكون كذلك np.concatenate([a,b]) يجب أن يتم تمرير المصفوفات التي تريد ربطهما على شكل تسلسل ، وليس كوسيطات منفصلة, لاحظ هذا الكود من التوثيق الرسمي ل NumPy numpy.concatenate((a1, a2, ...), axis=0) Join a sequence of arrays together. كان يحاول تفسير b كمعامل المحور ، ولهذا السبب اشتكى من أنه لا يمكنه تحويله إلى عدد قياسي. اقتباس
0 Ali Haidar Ahmad نشر 1 أغسطس 2021 أرسل تقرير نشر 1 أغسطس 2021 (معدل) المصفوفات التي تريد ربطها يجب أن يتم تمريرها على شكل sequence وليس كما قمت بتمريرهم على شكل وسيطين منفصلين كالتالي: import numpy a = numpy.array([1, 2, 3]) b = numpy.array([5, 6]) numpy.concatenate([a,b],axis=0) # array([1, 2, 3, 5, 6]) # أو numpy.concatenate((a,b)) # array([1, 2, 3, 5, 6]) وهناك طرق أخرى لربط المصفوفات أحادية البعد مثل numpy.r_ وnumpy.hstack : import numpy a = numpy.array([1, 2, 3]) b = numpy.array([5, 6]) numpy.r_[a, b] # array([1, 2, 3, 5, 6]) numpy.hstack([a, a]) # array([1, 2, 3, 1, 2, 3]) لكن غالباً الخيار الأفضل والأكثر سهولة هو concatenate لذا الآن دعنا نتعلم أكثر عنه: يمكن استخدام الدالة concatenate في NumPy لربط مصفوفتين إما على مستوى الصف "row-wise" أي يمعنى (axis=0) أو على مستوى العمود "column-wise". يمكن أن تأخذ الدالة concatenate مصفوفتين أو أكثر ، وافتراضياً تقوم بربطهم على أساس الأسطر ، أي المحور = 0: # concatenate 2 numpy arrays: row-wise import numpy as np array = np.arange(4) arr1 = array.reshape((2,2)) """ array([[0, 1], [2, 3]]) """ arr2 = np.arange(4,8).reshape(2,2) """ array([[4, 5], [6, 7]]) """ np.concatenate((arr1, arr2)) """ array([[0, 1], [2, 3], [4, 5], [6, 7]]) """ أما بالنسبة للأعمدة: # concatenate 2 numpy arrays: column-wise import numpy as np array = np.arange(4) arr1 = array.reshape((2,2)) """ array([[0, 1], [2, 3]]) """ arr2 = np.arange(4,8).reshape(2,2) """ array([[4, 5], [6, 7]]) """ np.concatenate((arr1,arr2),axis=1) """ array([[0, 1, 4, 5], [2, 3, 6, 7]]) """ ويمكنك ربط أكثر من مصفوفة: # concatenate 2 numpy arrays: column-wise import numpy as np array = np.arange(4) arr1 = array.reshape((2,2)) """ array([[0, 1], [2, 3]]) """ arr2 = np.arange(4,8).reshape(2,2) """ array([[4, 5], [6, 7]]) """ np.concatenate((arr1,arr2,arr1),axis=1) """ array([[0, 1, 4, 5, 0, 1], [2, 3, 6, 7, 2, 3]]) """ np.concatenate((arr1,arr2,arr1),axis=0) """ array([[0, 1], [2, 3], [4, 5], [6, 7], [0, 1], [2, 3]]) """ لكن تذكر أن الأبعاد يجب أن تكون صحيحة أي مثلاً لربط مصفوفتين على المحور 1، يجب أن يكون لكل من المصفوفتين نفس عدد الأسطر، أما بالنسبة للأسطر فيجب أن تتطابق أبعاد الأعمدة: ######################################## هنا سيعمل ######## import numpy as np arr1 = np.arange(4).reshape((2,2)) """ array([[0, 1], [2, 3]]) """ arr2 = np.arange(4,6).reshape(2,1) """ array([[4], [5]]) """ np.concatenate((arr1,arr2),axis=1) """ array([[0, 1, 4], [2, 3, 5]]) """ ######################################### لكن هنا لن يعمل لعدم إمكانية مطابقةالأبعاد######### arr2 = np.arange(4,6).reshape(1,2) # يجب أن تتطابق أبعاد الأعمدة #array([[4, 5]]) np.concatenate((arr1,arr2),axis=1) @ ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 0, the array at index 0 has size 2 and the array at index 1 has size 1 أيضاً لربط المصفوفات يمكننا استخدام vstack وهي تكافئ concatenate عندما يكون المحور =0 حيث تقوم بتكديس المصفوفات عمودياً أي row wise: import numpy as np arr1 = np.arange(4).reshape((2,2)) """ array([[0, 1], [2, 3]]) """ arr2 = np.arange(4,6).reshape(1,2) # الأبعاد الأفقية يجب أن تطابق عند التكديس العمودي """ array([[4], [5]]) """ np.vstack((arr1, arr2)) """ array([[0, 1], [2, 3], [4, 5]]) """ أما hstack فهي مثل concate أيضاً لكن تستخدم لتكديس المصفوفات أفقياً: import numpy as np arr1 = np.arange(4).reshape((2,2)) """ array([[0, 1], [2, 3]]) """ arr2 = np.arange(4,6).reshape(2,1) # ركز """ array([[4], [5]]) """ np.hstack ((arr1, arr2)) """ array([[0, 1, 4], [2, 3, 5]]) """ تم التعديل في 1 أغسطس 2021 بواسطة Ali Haidar Ahmad اقتباس
0 Ahmed Sharshar نشر 1 أغسطس 2021 أرسل تقرير نشر 1 أغسطس 2021 الدالة concatenate تستخدم لدمج أكثر من مصفوفة سوية، وتستخدم على الشكل التالي: numpy.concatenate((a1, a2, ...), axis=0) حيث أن axis هو الاتجاة الذي نريد الدمج عليه، فاذا كان = 0 فهذا معناه اننا نريد دمج الصفوف سويا أما ان كان axis =1 فاننا نريد دمج الاعمدة سويا. المشكلة أنه يحاول ربط المصفوفات بالفهرس الخاص بكل عنصر index وليس بقيمه العناصر، وسبب ذلك الاساسي هو شكل استخدامك للدالة حيث قمت بتمرير المصفوفات كالتالي: np.concatenate(a, b) وفي numpy ، يكون الاساس هو الترميز بالفهرسه index لكل عنصر ، الا اذا لم توضع الاقواس [ ]قبل المصفوفة،أو باضافة اقواس ( ) اضافية: لذلك فان التعديل الذي يجب صنعه كالتالي: >>> import numpy as np >>> a = np.array([1, 2, 3]) >>> b = np.array([4, 5]) >>> np.concatenate([a, b]) #النعديل >>> np.concatenate((a, b)) #خيار اخر للتعديل اقتباس
السؤال
Fahmy Mostafa
لدي مصفوفتان Numpy بسيطتان أحادي البعد one-dimensional. حاولت أن أقوم بربطهم باستخدام التابع numpy.concatenate كالتالي:
لكنني تلقيت هذا الخطأ التالي:
TypeError: only integer scalar arrays can be converted to a scalar index
لماذا يظهر هذا الخطأ؟ وكيف يمكنني ربط المصفوفتان معًا؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.