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

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

Amer Abdallah

السؤال

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

arr = arr.astype(numpy.float32)

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

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

Recommended Posts

  • 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)
# لاحظ أنه لم يحدث أي تغيير لذا لاأظنها حلاً لمشكلتك

 

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

  • 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])

اذا تم التحويل في نفس المكان

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

  • 0

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

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

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

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...