副本与视图
在执行函数时,其中一些返回输入数组的副本,而另一些返回视图;当物理存储在另一位置时,称为副本,另一方面,如果提供了相同内存内容的,则将其称为视图
无复制,简单的赋值不会创建对象的副本,相反,它使用原始数组的相同id()来访问它;id()返回python对象的内存地址,类似于C中的指针
import numpy as np
arr = np.arange(6)
print(arr) #输出为 [0 1 2 3 4 5]
print(id(arr)) #输出为 2819351031120
brr = arr
#brr的id与arr的相同
print(id(brr)) #输出为 2819351031120
#修改brr的形状arr的也会随之改变
brr.shape = (2,3)
print(brr) #输出为 [[0 1 2]
# [3 4 5]]
print(arr) #输出为 [[0 1 2]
# [3 4 5]]
视图或浅复制
numpy拥有ndarray.view()方法,它是一个新的数组对象,并且有与原始数据相同的数据,与前一种情况不同,新数组的位数更改不会影响原始数据的维数,数组的切片也会创建视图,但内容的改变,会影响原始数据,它们的物理内存不一样
import numpy as np
arr = np.arange(6).reshape(2,3)
print(arr) #输出为 [[0 1 2]
# [3 4 5]]
print(id(arr)) #输出为 1947690446400
#创建arr的视图brr,brr = arr.view()
brr = arr.view()
#brr的id与arr的不相同
print(brr) #输出为 [[0 1 2]
# [3 4 5]]
print(id(brr)) #输出为 1947693302368
#修改brr的形状arr的不会改变,但是更改brr里面的值arr的也会改变
brr.shape = (1,6)
brr[0,0] = 10
print(brr) #输出为 [[10 1 2 3 4 5]]
print(arr) #输出为 [[10 1 2]
# [ 3 4 5]]
副本深复制
ndarray.copy()函数创建一个深层副本, 它是数组及其数据的完整副本,不与原始数组共享,物理内存独立,数据修改也不影响原数据
import numpy as np
arr = np.array([[4,5,6],[7,8,9]])
print(arr) #输出为 [[4 5 6]
# [7 8 9]]
#查看原数组的ID
print(id(arr)) #输出为 2195164605776
#创建arr的副本,brr = arr.copy()
brr = arr.copy()
#brr的id与arr的不相同
print(brr) #输出为 [[4 5 6]
# [7 8 9]]
print(id(brr)) #输出为 2195166379824
#修改brr的值arr的不会改变
brr[0,0] = 10
print(brr) #输出为 [[10 5 6]
# [ 7 8 9]]
print(arr) #输出为 [[4 5 6]
# [7 8 9]]