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

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

Fahmy Mostafa

السؤال

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

>>> 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؟ وفي حالة عدم وجود فرق بينهما، ما هي الحاجة إلى وظيفتين مختلفتين تؤديان نفس الوظيفة؟

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

Recommended Posts

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

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

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...