Amer Abdallah نشر 10 أغسطس 2021 أرسل تقرير نشر 10 أغسطس 2021 هل هناك طريقة سريعة "للتسوية الفرعية sub-flatten" أو تسطيح بعض الأبعاد فقط في مصفوفة صغيرة؟ على سبيل المثال، إن كان لدي مصفوفة أبعادها (50 ،100 ،25)، فإن أبعاد المصفوفة الناتجة ستكون (5000، 25) أي تم ضرب بعدين معًأ (100 * 50) = 5000 كيف يمكن القيام بذلك في Numpy؟ اقتباس
1 Ali Haidar Ahmad نشر 10 أغسطس 2021 أرسل تقرير نشر 10 أغسطس 2021 (معدل) يمكنك القيام بذلك من خلال الدالة reshape هذه الدالة تمكنك من تعديل أبعاد المصفوفة بالشكل الذي تريده، والشرط الوحيد هو أن كون عدد العناصر في المصفوفة الجديدة التي تريد إعادة تشكيلها = عدد العناصر في المصفوفة الأصلية. أي إذا كانت المصفوفة الأصلية مصفوفة أحادية البعد ب 12 عنصر وأردنا تحويلها لمصفوفة ثنائية ببعدين وبالتالي يجب أن يكون ناتج جداء البعد الأول بالثاني =12 وبالتالي يمكن أن نستنتج أن أبعاد المصفوفة الناتجة إحدى الخيارات التالية: a=np.arange(12) a.reshape(3,4) """ array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) """ a.reshape(4,3) """ array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11]]) """ a.reshape(6,2) """ array([[ 0, 1], [ 2, 3], [ 4, 5], [ 6, 7], [ 8, 9], [10, 11]]) """ a.reshape(2,6) a.reshape(4,4) # ValueError: cannot reshape array of size 12 into shape (4,4) كما أننا يمكننا أن نمرر له بعد واحد والبعد الآخر نضع مكانه -1 و هو سيستنتجه تلقائياً وفقاُ لمعادلة الجداء: a=np.arange(12) a.reshape(-1,4) # سيستنتج أنه3 """ array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) """ الآن بالتأكيد أصبحت تستطيع معالجة مشكلتك، حيث يمكنك التلاعب بشكل الإخراج بالشكل الذي تريده: arr = np.ones((50,100,25)) arr.shape # (50, 100, 25) arr1=arr.reshape(-1,50) # 100*25 arr1.shape #(2500, 50) arr2=arr.reshape(-1,25) # 100*50 arr2.shape #(5000, 25) arr3=arr.reshape(50,-1) # 100*25 arr3.shape #(50, 2500) arr4=arr.reshape(100,-1) arr4.shape # (100, 1250) arr5=arr.reshape(-1,100) arr5.shape #(1250, 100) أو مثلاً لو لدينا مصفوفة ب 4 أبعاد: arr = np.ones((50,100,25,4)) arr.shape #(50, 100, 25, 4) arr1=arr.reshape(-1,50) # 100*25*4 arr1.shape # (10000, 50) arr2=arr.reshape(50,100,-1) # 25*4 arr2.shape #(50, 100, 100) وهكذا.. تم التعديل في 10 أغسطس 2021 بواسطة Ali Haidar Ahmad 1 اقتباس
0 عبدالباسط ابراهيم نشر 11 أغسطس 2021 أرسل تقرير نشر 11 أغسطس 2021 بالإضافة للشرح الوافي ل reshape كما في التعليق السابق ولكن إذا كانت هناك العديد من الأبعاد وتحتاج عمل flat للكل عدا البعد الأخير يمكنك استخدام الحل التالي arr = numpy.zeros((50,100,25)) new_arr = arr.reshape(-1, arr.shape[-1]) new_arr.shape # (5000, 25) أو مثلاً عدا آخر بعدين arr = numpy.zeros((3, 4, 5, 6)) new_arr = arr.reshape(-1, *arr.shape[-2:]) new_arr.shape # (12, 5, 6) لاحظ مثال آخر arr = numpy.zeros((3, 4, 5, 6, 7, 8)) new_arr = arr.reshape(*arr.shape[:2], -1, *arr.shape[-2:]) new_arr.shape # (3, 4, 30, 7, 8) 1 اقتباس
السؤال
Amer Abdallah
هل هناك طريقة سريعة "للتسوية الفرعية sub-flatten" أو تسطيح بعض الأبعاد فقط في مصفوفة صغيرة؟
على سبيل المثال، إن كان لدي مصفوفة أبعادها (50 ،100 ،25)، فإن أبعاد المصفوفة الناتجة ستكون (5000، 25)
أي تم ضرب بعدين معًأ (100 * 50) = 5000
كيف يمكن القيام بذلك في Numpy؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.