Fahmy Mostafa نشر 1 أغسطس 2021 أرسل تقرير نشر 1 أغسطس 2021 في الكود البسيط التالي، كلتا الداتين ترجعان نفس النتيجة: >>> import numpy as np >>> y = np.array(((1,2,3),(4,5,6),(7,8,9))) >>> y.flatten() array([1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> y.ravel() array([1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> ما الفرق بين الدالتين flatten و ravel؟ وفي حالة عدم وجود فرق بينهما، ما هي الحاجة إلى وظيفتين مختلفتين تؤديان نفس الوظيفة؟ 1 اقتباس
0 محمد أبو عواد نشر 1 أغسطس 2021 أرسل تقرير نشر 1 أغسطس 2021 flatten هي طريقة لكائن ndarray وبالتالي لا يمكن استدعاؤها إلا لمصفوفات عددية حقيقية. ravel هي وظيفة على مستوى المكتبة وبالتالي يمكن استدعاؤها على أي كائن يمكن تحليله بنجاح. على سبيل المثال ، ستعمل ravel على قائمة من ndarrays ، بينما لا تتوفر flatten لهذا النوع من الكائنات, وأيضا flatten تقوم دائما بإرجاع نسخةو بينما يعيد ravel عرضا للمصفوفة الأصلية كلما أمكن ذلك, هذا غير واضح عند الطباعة ولكن إذا قمت بتعديل المصفوفة التي تم إرجاعها بواسطة ravel ، فقد تقوم بتعديل المدخلات في المصفوفة الأصلية, إذا قمت بتعديل المدخلات في مصفوفة تم إرجاعها من flatten فلن يحدث هذا أبدا, غالبا ما يكون ravel أسرع نظرا لعدم نسخ الذاكرة. اقتباس
1 Ali Haidar Ahmad نشر 1 أغسطس 2021 أرسل تقرير نشر 1 أغسطس 2021 (معدل) الدالة flatten دوماً تعيد نسخة أي "copy". أما ravel فيقوم بإرجاع view (طريقة أخرى لعرض بيانات المصفوفة. وتعني أنه يتم مشاركة بيانات كلا الكائنين.) للمصفوفة الأصلية كلما أمكن ذلك. وهذا يكون غير مرئي في الإخراج الذي يتم طباعته، لكن إذا قمت بتعديل المصفوفة التي تم إرجاعها بواسطة رافيل، فسيتم التعديل أيضاً في المصفوفة الأصلية. أما إذا قمت بذلك في flatten فلن يحدث ذلك. غالبًا ما يكون ravel أسرع نظرًا لعدم نسخ ذاكرة ، ولكن عليك أن تكون أكثر حذراً بشأن تعديل المصفوفة التي تعيدها. انظر للمثال التالي الذي يوضح الأمر: import numpy as np y = np.arange(9).reshape(-1,3) """array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])""" e=y.flatten() # array([0, 1, 2, 3, 4, 5, 6, 7, 8]) a=y.ravel() # array([0, 1, 2, 3, 4, 5, 6, 7, 8]) a[0]=144 print(a) # [144 1 2 3 4 5 6 7 8] print(y) """ [[144 1 2] [ 3 4 5] [ 6 7 8]] """ e[2]=88 print(e) # [ 0 1 88 3 4 5 6 7 8] print(y) # لاحظ كيف لم ينتقل التعديل """ [[144 1 2] [ 3 4 5] [ 6 7 8]] """ تم التعديل في 1 أغسطس 2021 بواسطة Ali Haidar Ahmad 1 اقتباس
0 Ahmed Sharshar نشر 1 أغسطس 2021 أرسل تقرير نشر 1 أغسطس 2021 تقوم الدالة flatten دائما بعمل نسخة من المصفوفة المراد تعديلها، وذلك للحفاظ على المصفوفة الاصلية، لكن ذلك يحتاج الى مساحة أكبر لتخزين كلا المصفوفتين.كذلك فانها كائن ndarray وبالتالي لا يمكن استدعاؤها إلا لمصفوفات عددية حقيقية أي تنتمي فقط ل Numpy. اما الدالة ravel فتقوم بارجاع المصفوفة الاصلية متى كان ذلك قابلا للعرض، اما اذا لم تكن قابلة للعرض فانها قد تقوم بتعديل المصفوفة باكملها. لذلك عادة ما تكون أسرع من flatten لانها لا تحتاج الى عمل نسخ للمصفوفة.هي وظيفة على مستوى المكتبة وبالتالي يمكن استدعاؤها على أي كائن يمكنلا يشترط أن تكون من نوعيه ndarray. مثال على الفرق في استخدام الدالتين: import numpy as np # Create a numpy array a = np.array([(1,2,3,4),(3,1,4,2)]) # Let's print the array a print ("Original array:\n ") print(a) print ("Dimension of array-> " , (a.ndim)) print("\nOutput for RAVEL \n") # Convert nd array to 1D array b = a.ravel() print(b) b[0]=1000 print(b) print(a) print ("Dimension of array->" ,(b.ndim)) print("\nOutput for FLATTEN \n") # Convert nd array to 1D array c = a.flatten() # Flatten تقوم باعطاء نسخه من c print(c) c[0]=0 print(c) # a لن ينتج عنه تعديل في c هنا التعديل في print(a) print ("Dimension of array-> " , (c.ndim)) ويكون الخرج كالتالي: Original array: [[1 2 3 4] [3 1 4 2]] Dimension of array-> 2 Output for RAVEL [1 2 3 4 3 1 4 2] [1000 2 3 4 3 1 4 2] [[1000 2 3 4] [ 3 1 4 2]] Dimension of array-> 1 Output for FLATTEN [1000 2 3 4 3 1 4 2] [0 2 3 4 3 1 4 2] [[1000 2 3 4] [ 3 1 4 2]] Dimension of array-> 1 يمكنك أن تلاحظ الفرق بين أشكال المصفوفات الخارجه من كلتا الطريقتين وكذلك أن flatten تاخذ نسخه من الدالة الاصلية فقط. اقتباس
السؤال
Fahmy Mostafa
في الكود البسيط التالي، كلتا الداتين ترجعان نفس النتيجة:
ما الفرق بين الدالتين flatten و ravel؟ وفي حالة عدم وجود فرق بينهما، ما هي الحاجة إلى وظيفتين مختلفتين تؤديان نفس الوظيفة؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.