• 0

ما الفرق بين الدالتين flatten و ravel في مكتبة Numpy؟

في الكود البسيط التالي، كلتا الداتين ترجعان نفس النتيجة:

>>> 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 شخص أعجب بهذا

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


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

الدالة 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]]
"""

 

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

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


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

flatten هي طريقة لكائن ndarray وبالتالي لا يمكن استدعاؤها إلا لمصفوفات عددية حقيقية. ravel هي وظيفة على مستوى المكتبة وبالتالي يمكن استدعاؤها على أي كائن يمكن تحليله بنجاح. على سبيل المثال ، ستعمل ravel على قائمة من ndarrays ، بينما لا تتوفر flatten لهذا النوع من الكائنات, وأيضا flatten تقوم دائما بإرجاع نسخةو بينما يعيد ravel عرضا للمصفوفة الأصلية كلما أمكن ذلك, هذا غير واضح عند الطباعة ولكن إذا قمت بتعديل المصفوفة التي تم إرجاعها بواسطة ravel ، فقد تقوم بتعديل المدخلات في المصفوفة الأصلية, إذا قمت بتعديل المدخلات في مصفوفة تم إرجاعها من flatten فلن يحدث هذا أبدا, غالبا ما يكون ravel أسرع نظرا لعدم نسخ الذاكرة.

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


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

تقوم الدالة 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 تاخذ نسخه من الدالة الاصلية فقط.

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


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

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

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

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


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

تسجيل الدخول

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


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