Numpy数组的复制
对于数组的复制,新手可能会产生疑惑,有时会复制出一个新的数组,但有时不会,比如:
数组引用
引用数组并不会创建一个新的数组,新数组和源数组其实是一个对象
import numpy as np
a = np.arange(12)
b = a #数组只是引用,并未复制
print(b is a) #True,因为这2个数组相同
b.shape = 3,4 #同样改变了a的形状
print(a.shape) #(3, 4)
a[0,0]=123 #同样改变了b[0,0]
print(b[0,0]) #123
数组浅复制
浅复制会创建一个新的数组对象,新的数组对象有独立的形状等属性,但和源数组共享数据。浅复制数组用view函数。
c = a.view()
print(c is a) #False,c和a不是一个对象
print(c.base is a) #True,c的数据是a的
print(c.flags.owndata) #False,c没有独立的数据
c.shape = 2,6 #改变c的形状并不影响a的形状
print(a.shape) #(3,4)
c[0,4] = 1234 #改变c的元素值会导致a的元素值改变
print(a)
'''
array([[ 0, 1, 2, 3],
[1234, 5, 6, 7],
[ 8, 9, 10, 11]])
'''
数组深复制
深复制会创建一个新的数组对象,新的数组对象有独立的属性和数据。深复制数组用copy函数。
d = a.copy()
print(d is a) #False
print(d.base is a) #d的数据是独立的
d[0,0] = 9999 #改变d的数据不影响a的数据
print(a)
'''
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
'''