1. Hàm np.copy()

Hàm np.copy() được sử dụng để sao chép các giá trị từ một mảng có sẵn sang một mảng khác. Khi sử dụng hàm này, nếu như mảng ban đầu có sự thay đổi thì sẽ không ảnh hưởng đến mảng được sao chép.

Ví dụ dưới đây, sử dụng hàm np.copy() để sao chép các giá trị từ mảng a sang mảng x như sau:

import numpy as np 
# Mang a ban dau 
a = np.array([1, 2, 3, 4, 5]) 

# Mang x la ban sao cua mang a 
x = a.copy() 

# Thay doi gia tri mang a nhung khong anh huong den mang x 
a[0] = 42 

# Hien thi gia tri cua hai mang 
print("a = {0}".format(a)) 
print("x = {0}".format(x))

Kết quả:

a = [42  2  3  4  5]
x = [1 2 3 4 5]

Nếu như chúng ta cần kiểm tra mảng được copy có sử dụng kiểu dữ liệu của nó hay không, khi đó ta cần sử dụng thuộc tính np.base để thực hiện kiểm tra. Mọi mảng NumPy đều có thuộc tính base và trả về None nếu mảng sở hữu dữ liệu.Nếu không, thuộc tính base tham chiếu đến đối tượng ban đầu.

import numpy as np

a = np.array([1, 2, 3, 4, 5])
x = a.copy()
print(x.base)

Kết quả:

None

2. Hàm np.view()

Hàm np.view() được sử dụng để sao chép các phần tử của một mảng sang mảng mới. Tuy nhiên, khi mảng ban đầu có sự thay đổi sẽ ảnh hưởng đến mảng được sao chép. (Điều này ngược lại với hàm np.copy())

Ví dụ dưới đây, sử dụng hàm np.view() để sao chép các giá trị từ mảng a sang mảng x như sau:

import numpy as np 

# Mang a ban dau 
a = np.array([1, 2, 3, 4, 5]) 

# Mang x la ban sao cua mang a 
x = a.view() 

# Thay doi gia tri mang a se anh huong den mang x
a[0] = 42 

# Hien thi gia tri cua hai mang 
print("a = {0}".format(a)) 
print("x = {0}".format(x))

Kết quả:

a = [42  2  3  4  5]
x = [42  2  3  4  5]

Nếu như mảng được sao chép bị thay đổi giá trị thì mảng ban đầu cũng sẽ thay đổi theo. Cùng xem xét ví dụ dưới đây, mảng x được sao chép từ mảng ban đầu a, tuy nhiên khi x thay đổi giá trị thì mang ban đầu a cũng sẽ thay đổi theo:

import numpy as np

# Mang a ban dau
a = np.array([1, 2, 3, 4, 5])

# Mang x la ban sao cua mang a
x = a.view()

# Thay doi gia tri mang x se anh huong den mang a
x[0] = 31

# Hien thi gia tri cua hai mang 
print("a = {0}".format(a)) 
print("x = {0}".format(x))

Kết quả:

a = [31  2  3  4  5]
x = [31  2  3  4  5]

3. Sự khác biệt giữa Copy và View trong Numpy

Sự khác biệt chính giữa hàm np.copy()np.view() của một mảng là copy sẽ tạo ra một mảng mới mảng này khác với mảng ban đầu, trong khi đó view chỉ là phiên bản sao chép lại từ mảng ban đầu.

Copy sẽ tạo ra một mảng  mới, vì vậy khi mảng ban đầu thay đổi giá trị sẽ không ảnh hưởng đến mảng Copy. Hoặc mảng Copy thay đổi giá trị cũng không ảnh hưởng đến mảng ban đầu.

View chỉ sao chép giá trị từ một mảng sang mảng khác, vì vậy khi mảng ban đầu thay đổi giá trị thì sẽ ảnh hưởng đến mảng View và ngược lại, khi mảng View thay đổi giá trị thì cũng ảnh hưởng đến mảng ban đầu (thực chất hai mảng ban đầu và mảng View là một)