• 0

ربط مصفوفتين معًا في مكتبة Numpy

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

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

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

 

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


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

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

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

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


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

تسجيل الدخول

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


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