Numpy中的浅拷贝、深拷贝与视图
不复制的情况
·赋值操作不会进行复制
import numpy as np
a=np.array([1,2,3,4])
b=a
print(b is a)
------
True
·Python中的传递操作,传递的是引用,所以不会进行复制,比如函数操作
def f(x):
print(id(x))
print(id(a))
f(a)
------
2826941259408
2826941259408
浅拷贝与视图(view)
定义:浅拷贝是对另一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值
特点:公用一个值、这两个变量的内存地址一样、对其中一个变量的值改变,另一个变量的值也会改变
·使用 view 操作在不对某一个数组进行复制的情况下创建一个同样指向该数据的视图,这会是一个新的对象,但是会和原来的数组共享数据
a=np.array([1,2,3,4])
c=a.view()
print(c is a)
print(c.base is a)
c=c.reshape((2,2))
print(c.shape)
print(a.shape)
c[0,1]=1000
print(a)
------
False
True
(2, 2)
(4,)
[ 1 1000 3 4]
·numpy中数组进行切片(slice)操作时,会返回该数组的一个视图,也就是进行了浅复制(注意:python中list切片操作是深拷贝,numpy中切片是一种特殊的浅拷贝,出现了新的内存地址,但是数据修改仍会同步)
a=np.array([[1,2,3],[4,5,6]])
s=a[:,0:2]
s[:]=1000
print(a)
------
[[1000 1000 3]
[1000 1000 6]]
深拷贝
定义:一个变量对另一个变量值的拷贝
特点:变量的内存地址不同、变量各有自己的值且互不影响、对其任意一个变量的值的改变不会影响其余变量的值
·使用copy操作对数组进行深复制(deep copy),也就是实在地复制一份新的数据
a=np.array([[1,2,3,4,5,6]])
b=a.copy()
print(b is a)
print(b.base is a)
b=b.reshape((2,3))
print(b.shape)
print(a.shape)
b[0,1:3]=1000
print(b)
print(a)
------
False
False
(2, 3)
(1, 6)
[[ 1 1000 1000]
[ 4 5 6]]
[[1 2 3 4 5 6]]
·python中表(list)数据切片是深拷贝
a=[1,2,3,4,5,6]
c=a[0:3]
c.append(8)
a.append(9)
print(c)
print(a)
print(id(c))
print(id(a))
------
[1, 2, 3, 8]
[1, 2, 3, 4, 5, 6, 9]
1654092047424
1654092048128