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

السؤال

نشر

لدي مصفوفتان 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

لماذا يظهر هذا الخطأ؟ وكيف يمكنني ربط المصفوفتان معًا؟

Recommended Posts

  • 0
نشر

يجب تعديل السطر التالي

np.concatenate(a, b)

ليكون كذلك

np.concatenate([a,b])

يجب أن يتم تمرير المصفوفات التي تريد ربطهما على شكل تسلسل ، وليس كوسيطات منفصلة, لاحظ هذا الكود من التوثيق الرسمي ل NumPy 

numpy.concatenate((a1, a2, ...), axis=0)

Join a sequence of arrays together.

كان يحاول تفسير b كمعامل المحور ، ولهذا السبب اشتكى من أنه لا يمكنه تحويله إلى عدد قياسي.

  • 0
نشر (معدل)

المصفوفات التي تريد ربطها يجب أن يتم تمريرها على شكل 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]])
"""

 

تم التعديل في بواسطة Ali Haidar Ahmad
  • 0
نشر

 الدالة 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)) #خيار اخر للتعديل

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...