Amer Abdallah نشر 16 أغسطس 2021 أرسل تقرير نشر 16 أغسطس 2021 لنفترض أن لدي مصفوفة بسيطة كالتالي: >>> 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 Ali Haidar Ahmad نشر 16 أغسطس 2021 أرسل تقرير نشر 16 أغسطس 2021 (معدل) حسناً أنت لديك قائمة من المصفوفات، لذا للقيام بذلك هناك عدة طرق، أولها استخدام الدالة 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]]) """ تم التعديل في 16 أغسطس 2021 بواسطة Ali Haidar Ahmad 2 اقتباس
0 عبدالباسط ابراهيم نشر 16 أغسطس 2021 أرسل تقرير نشر 16 أغسطس 2021 نعم هناك العديد من الدوال التي تمكنك من تنفيذ المطلوب مثل استخدام 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 اقتباس
السؤال
Amer Abdallah
لنفترض أن لدي مصفوفة بسيطة كالتالي:
ما أحاول فعله هو تحويل القائمة السابقة إلى مصفوفة Numpy واحدة كالتالي:
أنا أقوم بحلها عن طريق التكرار على vstack في الوقت الحالي ولكنها يبدو أن هذه العملية بطيئة حقًا خصوصًا عند إستعمال قائمة كبيرة.
ما هي أفضل طريقة فعالة للقيام بعملية التحويل هذه؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.