• 0

كيفية تحويل قائمة من مصفوفات numpy متداخلة إلى مصفوفة واحدة؟

لنفترض أن لدي مصفوفة بسيطة كالتالي:

>>> import numpy as np
>>> lst = [np.array([1, 2, 3]), np.array([[4, 5, 6],[7, 8, 9]])]

ما أحاول فعله هو تحويل القائمة السابقة إلى مصفوفة Numpy واحدة كالتالي:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

أنا أقوم بحلها عن طريق التكرار على vstack في الوقت الحالي ولكنها يبدو أن هذه العملية بطيئة حقًا خصوصًا عند إستعمال قائمة كبيرة.

ما هي أفضل طريقة فعالة للقيام بعملية التحويل هذه؟

2 اشخاص أعجبوا بهذا

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


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

حسناً أنت لديك قائمة من المصفوفات، لذا للقيام بذلك هناك عدة طرق، أولها استخدام الدالة stack حيث تقوم هذه الدالة بتكديس المصفوفات على المحور المحدد لها (طبعاً يجب أن تكون المصفوفات متجانسة في الأبعاد بالنسبة للمحور المحدد لكي يتم التكديس):

import numpy 
li = [numpy.array([ 3, 5]),numpy.array([ 3, 5])]
# [array([3, 5]), array([3, 5])]
numpy.stack( li, axis=0 ) # التكديس على المحور العمودي
"""
array([[3, 5],
       [3, 5]])
"""
numpy.stack( li, axis=1 ) ألأفقي
"""
array([[3, 3],
       [5, 5]])
"""

أما بالنسبة للدالة concatenate فلايمكنك استخدامها في حالتك مباشرةً، حيث أن هذه الدالة تتطلب أن تكون المصفوفات متجانسة الأبعاد أي يجب أن تكون كل المصفوفات ثنائية البعد حتى تعمل، في الرابط التالي كل شيئ تحتاجه لمعرفة كيفية عملها:

أما إذا أردت تطبيقها على مثالك فلن ينجح ذلك لأن np.array([1, 2, 3]) تمثل شعاع أي ببعد واحد أما np.array([[4, 5, 6],[7, 8, 9]]) تمثل مصفوفة ثنائية وبالتالي لايمكن استخدام هذه الدالة لربطهما بالشكل الذي تريده. وسيعطي خطأ انظر:

import numpy as np
lst = [np.array([1, 2, 3]), np.array([[4, 5, 6],[7, 8, 9]])]
np.concatenate(lst, axis=0 )
"""
ValueError: all the input arrays must have same number of dimensions...

لذا يجب عليك توسيع أبعاد المصفوفة الأولى قبل أن تستخدمها ولكن هذا سيكون مكلف، لذا فإن أفضل حل هو استخدام Stack. أو vstack :

import numpy as np
lst = [np.array([1, 2, 3]), np.array([[4, 5, 6],[7, 8, 9]])]
np.vstack( lst )
"""
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
"""

كما  يمكنك استخدام row_stack:

import numpy as np
lst = [np.array([1, 2, 3]), np.array([[4, 5, 6],[7, 8, 9]])]
np.row_stack( lst )
"""
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
"""

 

تمّ تعديل بواسطة Ali Haidar Ahmad
2 اشخاص أعجبوا بهذا

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


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

نعم هناك العديد من الدوال التي تمكنك من تنفيذ المطلوب مثل 

استخدام concatenate

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])
np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
       [3, 4, 6]])
np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])

لاحظ استخدام المعامل axis

كما يمكنك استخدام stack 

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.stack((a, b))
array([[1, 2, 3],
       [4, 5, 6]])

ويمكنك أيضاً استخدام الدالة array كالتالي

numpy.array( LIST )

 

1 شخص أعجب بهذا

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


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

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

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

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


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

تسجيل الدخول

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


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