کپی در برابر 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می توانی مالکیت داده را سریع چک کنی.