Amer Abdallah نشر 17 أغسطس 2021 أرسل تقرير نشر 17 أغسطس 2021 لدي مصفوفة Numpy من نوع int32، كيف يمكنني تحويلها إلى float32 في مكانها (أي بدون نسخها إلى متغير جديد)؟ أود أن أفعل شيء كالكود التالي: arr = arr.astype(numpy.float32) بدون نسخ المصفوفة لأنها كبيرة للغاية. كيف يمكن القيام بذلك في Numpy؟ 1 اقتباس
3 Ali Haidar Ahmad نشر 17 أغسطس 2021 أرسل تقرير نشر 17 أغسطس 2021 الطريقتين السابقتين تعتمدان على إنشاء مايسمى view لكن ماهو هذا ال view وكيف ينتج.. دعنا نفهم ذلك؟ ال view أو المشهد هو عرض جديد للمصفوفة مع نفس البيانات. أو بمعنى أوضح فكما يقول اسمها، إنها ببساطة طريقة أخرى لعرض بيانات المصفوفة. من الناحية الفنية ، هذا يعني أنه تتم مشاركة بيانات كلا الكائنين. هذا العرض الجديد للمصفوفة ينتج في حالتين الأولى عند قيامك بتطبيق مفهوم ال slicing (مثلاً عرض جزء من المصفوفة أو كاملها)، أو تغيير نمط البيانات (أو كليهما). وفيما يلي توضيح أكبر. وله الشكل التالي في بايثون: ndarray.view([dtype][, type]) # الوسيط الأول هو نمط البيانات الذي تريده # الوسيط الثاني نوع العرض الذي سيتم إرجاعه أمثلة، أولاُ سنعطي مثال لكيفية إنتاج مشهد للمصفوفة من خلال مفهوم التشريح أو slicing: # Slice views أخذ شرائح من المصفوفة أو أقسام محددة منها # المصفوفة الناتجة تكون عبارة عن مشهد من المصفوفة الأصلية بحيث تتم مشاركة البيانات import numpy as np arr = np.arange(8) arr # array([0, 1, 2, 3, 4, 5, 6, 7]) # الآن سنطبق مفهوم الشرائح ve = arr[1:2] ve # array([1]) # سنعدل قيمة في المصفوفة الأصلية لنرى فيما إذا كان حقاً قد تم تشارك البيانات arr[1] = 2 # لاحظ كيف تغيرت هي أيضاً ve # array([2]) # مثال آخر ve1 = arr[1::3] ve1 # array([1, 4, 10]) arr[7] = 10 ve1 #array([1, 4, 7]) الآن الطريقة الأخرى لإنتاج مشهد وهي تغيير نمط البيانات (حل مشكلتك): # Dtype views import numpy as np arr = np.arange(8, dtype='int32') arr # array([0, 1, 2, 3, 4, 5, 6, 7], dtype=int32) v = arr.view('float32') v """ array([0.e+00, 1.e-45, 3.e-45, 4.e-45, 6.e-45, 7.e-45, 8.e-45, 1.e-44], dtype=float32) """ # حسناً هنا صحيح أنهما تشاركا البيانات لكن حصل تشويه وهذ منطقي جداً لاختلاف حجم البايت بين النمطين (أنت تحاول تغيير النمط في نفس المكان) للقيم لذا يمكننا أن نعود بعد ذلك لفكرة التشريح # نقوم بإسناد قيم المصفوفة الأصلية ذات النمط الصحيح إلى المشهد ذو القيم الحقيقية v[:]=arr v[:] # array([0., 1., 2., 3., 4., 5., 6., 7.], dtype=float32) #وبالتالي هنا نكون حصلنا على مانريده # الآن لو نظرنا لقيم المصفوفة الأصلية arr """ array([ 0, 1065353216, 1073741824, 1077936128, 1082130432, 1084227584, 1086324736, 1088421888], dtype=int32) """ # ولو قمنا بتعديل أي قيمة فيها arr[2]=0 v # array([0., 1., 0., 3., 4., 5., 6., 7.], dtype=float32) # نلاحظ أن التعديل أنتقل إلى المصفوفة هذا يعني أنهما يتشاركان البيانات ########################################################################### #false مع تحديد النسخ على Astype بالنسبة لاستخدام #view فلا أظنها ترجع # كما أنني لم ارى ذلك في التوثيق # انظر للمثال التالي import numpy as np arr = np.arange(8, dtype='int32') arr # array([0, 1, 2, 3, 4, 5, 6, 7], dtype=int32) vv = arr.astype(np.float32, copy=False) vv # array([0., 1., 2., 3., 4., 5., 6., 7.], dtype=float32) arr[0]=5 arr # array([5, 1, 2, 3, 4, 5, 6, 7], dtype=int32) vv # array([0., 1., 2., 3., 4., 5., 6., 7.], dtype=float32) # لاحظ أنه لم يحدث أي تغيير لذا لاأظنها حلاً لمشكلتك 3 اقتباس
0 محمد أبو عواد نشر 17 أغسطس 2021 أرسل تقرير نشر 17 أغسطس 2021 يمكنك إنشاء view بنوع مختلف ثم نسخه كالتالي import numpy as np x = np.arange(10, dtype='int32') y = x.view('float32') y[:] = x print(y) سوف تحصل على الآتي array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], dtype=float32) لإظهار أن التحويل كان في مكانه ، لاحظ أن النسخ من x إلى y تم تغيير x: print(x) سوف يكون الناتج كالآتي array([0, 1065353216, 1073741824, 1077936128, 1082130432, 1084227584, 1086324736, 1088421888, 1090519040, 1091567616]) اذا تم التحويل في نفس المكان 1 اقتباس
0 عبدالباسط ابراهيم نشر 17 أغسطس 2021 أرسل تقرير نشر 17 أغسطس 2021 يمكنك استخدام astype مع المعامل copy بالقيمة false a = a.astype(numpy.float32, copy=False) لكن لاحظ أن استخدام المعامل copy بالقيمة false أنه دائماً يقوم بعمل view وليس copy حيث أن هذه الدالة تقوم بتفادي النسخ إذا كانت تقدر على ذلك فهناك حالات لا تستطيع تنفيذ ذلك 1 اقتباس
السؤال
Amer Abdallah
لدي مصفوفة Numpy من نوع int32، كيف يمكنني تحويلها إلى float32 في مكانها (أي بدون نسخها إلى متغير جديد)؟ أود أن أفعل شيء كالكود التالي:
بدون نسخ المصفوفة لأنها كبيرة للغاية. كيف يمكن القيام بذلك في Numpy؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.