NumPy Array Copy vs View

تفاوت بین Copy و View

تفاوت اصلی میان کپی (copy) و مشاهده (view) یک آرایه در این است که کپی، یک آرایه جدید ولی مشاهده تنها یک مشاهده از آرایه اصلی است. به این معنی که کپی مالک داده‌ها است و هر گونه تغییر در آن هیچ اثری بر داده‌های اصلی نخواهد داشت و برعکس. اما 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)

خروجی:


import numpy as np

arr = np.array([1, 2, 3, 4, 5])
x = arr.view()
arr[0] = 42

print(arr)
print(x)

خروجی:

بررسی اینکه آرایه مالک داده‌های خود هست یا خیر

چنانکه در بالا توضیح داده شد، کپی مالک داده‌های خود است ولی view مالک داده‌های خود نیست. اما چگونه تشخیص دهیم که یک آرایه مالک داده‌های خود هست یا خیر؟

هر آرایه NumPy دارای خصوصیتی به اسم base است که خروجی آن در صورتی که آرایه مالک داده‌ها باشد None و در غیر اینصورت خروجی آن به داده‌های اصلی اشاره می‌کند.


import numpy as np

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

x = arr.copy()
y = arr.view()

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

خروجی: