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

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

Amer Abdallah

السؤال

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

>>> 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 في الوقت الحالي ولكنها يبدو أن هذه العملية بطيئة حقًا خصوصًا عند إستعمال قائمة كبيرة.

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

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

Recommended Posts

  • 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
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 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 )

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...