• 0

تحويل مصفوفة Numpy من نوع int32 إلى float32 بدون نسخها

لدي مصفوفة Numpy من نوع int32، كيف يمكنني تحويلها إلى float32 في مكانها (أي بدون نسخها إلى متغير جديد)؟ أود أن أفعل شيء كالكود التالي:

arr = arr.astype(numpy.float32)

بدون نسخ المصفوفة لأنها كبيرة للغاية. كيف يمكن القيام بذلك في Numpy؟

1 شخص أعجب بهذا

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


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

الطريقتين السابقتين تعتمدان على إنشاء مايسمى 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

يمكنك إنشاء 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

يمكنك استخدام astype مع المعامل copy بالقيمة false

a = a.astype(numpy.float32, copy=False)

لكن لاحظ أن استخدام  المعامل copy بالقيمة false أنه دائماً يقوم بعمل view وليس copy حيث أن هذه الدالة تقوم بتفادي النسخ إذا كانت تقدر على ذلك فهناك حالات لا تستطيع تنفيذ ذلك

1 شخص أعجب بهذا

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


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

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

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

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


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

تسجيل الدخول

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


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