فهرست سرفصل‌های NumPy
خانه (HOME) مقدمه (Intro) شروع کار (Getting Started) ساخت آرایه ها (Creating Arrays) ایندکس گذاری آرایه (Array Indexing) برش آرایه (Array Slicing) انواع داده (Data Types) کپی در برابر View (Copy vs View) شکل آرایه (Array Shape) تغییر شکل آرایه (Array Reshape) حلقه روی آرایه (Array Iterating) ترکیب آرایه ها (Array Join) تقسیم آرایه ها (Array Split) جستجو در آرایه (Array Search) مرتب سازی آرایه (Array Sort) فیلتر کردن آرایه (Array Filter) مقدمه تصادفی سازی (Random Intro) توزیع داده (Data Distribution) جابه جایی تصادفی (Random Permutation) ماژول Seaborn (Seaborn Module) توزیع نرمال (Normal Distribution) توزیع دوجمله ای (Binomial Distribution) توزیع پواسون (Poisson Distribution) توزیع یکنواخت (Uniform Distribution) توزیع لجستیک (Logistic Distribution) توزیع چندجمله ای (Multinomial Distribution) توزیع نمایی (Exponential Distribution) توزیع کای دو (Chi Square Distribution) توزیع ریلی (Rayleigh Distribution) توزیع پارتو (Pareto Distribution) توزیع زیف (Zipf Distribution) مقدمه ufunc (ufunc Intro) ساخت تابع ufunc (ufunc Create Function) حساب ساده با ufunc (ufunc Simple Arithmetic) گرد کردن اعشار با ufunc (ufunc Rounding Decimals) لگاریتم ها با ufunc (ufunc Logs) جمع ها با ufunc (ufunc Summations) حاصل ضرب ها با ufunc (ufunc Products) تفاضل ها با ufunc (ufunc Differences) کمترین مضرب مشترک با ufunc (ufunc Finding LCM) بزرگترین مقسوم علیه مشترک با ufunc (ufunc Finding GCD) توابع مثلثاتی با ufunc (ufunc Trigonometric) توابع هذلولوی با ufunc (ufunc Hyperbolic) عملیات مجموعه ای با ufunc (ufunc Set Operations) ویرایشگر (Editor) آزمون (Quiz) تمارین (Exercises) سرفصل دوره (Syllabus) برنامه مطالعه (Study Plan) گواهینامه (Certificate)
نتیجه‌ای برای جستجو یافت نشد.
NumPy

NumPy — کپی در برابر View (Copy vs View)

آخرین بروزرسانی: 1404/08/25

کپی در برابر View (Copy vs View)

وقتی با آرایه های بزرگ کار می کنی، موضوع کپی در نامپای و view خیلی مهم می شود. مثل این است که یا از جزوه دوستت عکس بگیری، یا جزوه اش را امانت بگیری.

تفاوت کپی در نامپای و View چیست؟

در نامپای، کپی (Copy) یعنی آرایه جدید با حافظه جدا. هر تغییری روی کپی، روی آرایه اصلی اثر ندارد. ویو (View) فقط یک نمای دیگر از همان داده است؛ مثل پنجره دومی به همان حیاط.

اگر view را عوض کنی، داده اصلی هم عوض می شود. اگر آرایه اصلی را عوض کنی، view هم تغییر را نشان می دهد. پس درک کپی در نامپای برای جلوگیری از باگ خیلی مهم است.

مثال کپی: داده جدا، خیال راحت

در این مثال یک آرایه می سازیم، از آن کپی می گیریم، سپس عنصر اول آرایه اصلی را عوض می کنیم و هر دو را چاپ می کنیم.

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

x = arr.copy()

arr[0] = 42

print(arr)
print(x)

مشاهده در ادیتور

می بینی که arr عوض شده، ولی x همان آرایه قبلی است. یعنی کپی مالک داده خودش است و تغییرها را جدا نگه می دارد.

مثال View: استفاده دوباره از همان داده

حالا به جای copy() از view() استفاده می کنیم. این بار آرایه اصلی را عوض می کنیم و می بینیم view هم تغییر می کند.

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

x = arr.view()

arr[0] = 42

print(arr)
print(x)

مشاهده در ادیتور

اینجا هر دو آرایه مقدار 42 را نشان می دهند. چون x فقط یک view روی داده های arr است، نه یک کپی مستقل.

تغییر روی View چه اثری دارد؟

حالا برعکس عمل می کنیم. این بار مقدار view را عوض می کنیم و نتیجه را روی آرایه اصلی می بینیم. این مثال هم نشان می دهد view و آرایه اصلی به یک داده وصل هستند.

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

x = arr.view()

x[0] = 31

print(arr)
print(x)

مشاهده در ادیتور

این جا هم می بینی عنصر اول هر دو آرایه 31 شده است. چون ویو مالک داده نیست و تغییر روی آن، داده اصلی را عوض می کند.

چطور بفهمیم آرایه مالک داده است؟

هر آرایه نامپای یک ویژگی به نام base دارد. اگر base برابر None باشد یعنی آرایه مالک داده است. اگر نباشد، یعنی یک view روی آرایه دیگری است.

در مثال زیر، از آرایه اصلی یک کپی و یک view می سازیم و مقدار base را چاپ می کنیم.

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

x = arr.copy()

y = arr.view()

print(x.base)
print(y.base)

مشاهده در ادیتور

خروجی برای x مقدار None است؛ یعنی کپی است و مالک داده خودش. اما برای y آرایه اصلی برگردانده می شود؛ یعنی y فقط یک view است.

کِی از کپی در نامپای و کِی از View استفاده کنیم؟

اگر داده برایت خیلی حساس است و نباید ناخواسته عوض شود، کپی امن تر است؛ مخصوصا وقتی آرایه را به توابع مختلف می دهی.

اما اگر آرایه خیلی بزرگ است و فقط می خواهی از همان داده چند نما بسازی، view حافظه را حفظ می کند و سریع تر است. پس انتخاب درست بین کپی در نامپای و view، هم باگ ها را کم می کند هم سرعت را بالا می برد.

برای دیدن انواع داده روی همین آرایه ها، می توانی به صفحه انواع داده در نامپای سر بزنی. همچنین در صفحه برش آرایه در نامپای می بینی که viewها چطور از روی slicing ساخته می شوند.

اگر نیاز به مرور کلی داشتی، صفحه کپی در برابر View (Copy vs View) همیشه به عنوان مرجع سریع کنار دستت است.

جمع بندی سریع

  • کپی در نامپای آرایه جدید می سازد و مالک داده خودش است.
  • View فقط یک نمای دیگر از همان داده آرایه اصلی است.
  • تغییر در کپی روی آرایه اصلی اثری ندارد.
  • تغییر در view هم آرایه اصلی را عوض می کند.
  • با ویژگی base می توانی مالکیت داده را سریع چک کنی.