更过的Numpy教程连载内容:https://www.jianshu.com/nb/47449944
Numpy中的深复制、浅复制与视图(View)
不复制的情况
-
赋值操作不会对数组进行复制
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) ------ 2838517155760 2838517155760
浅复制与视图(view)
-
不同的数组对象可能有公共的数据,可以使用
view
操作在不对某一个数组进行复制的情况下创建一个同样指向该数据的视图,这会是一个新的对象,但是会和原来的数组共享数据,这被称之为浅复制(shallow copy):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]
-
对一个数组进行切片(slice)操作时,会返回该数组的一个视图,也就是进行了浅复制:
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]]
网友评论