当计算和操作数组时,它们的数据有时被复制到新的数组中,有时不复制。这里我们做个区分。
完全不复制
简单赋值不会创建数组对象或其数据的拷贝。
import numpy as np a = np.arange(6) a Out[165]: array([0, 1, 2, 3, 4, 5]) b = a id(a) Out[166]: 336914267312 id(b) # id(a)和id(b)结果相同 Out[167]: 336914267312 b.shape = 3,2 a.shape # 修改b形状,结果a的形状也变了 Out[170]: (3, 2) b[0,0] = 12 #修改b的值,结果a的值也变化 b Out[168]: array([[12, 1], [ 2, 3], [ 4, 5]]) a Out[169]: array([[12, 1], [ 2, 3], [ 4, 5]])
视图或浅复制
不同的数组对象可以共享相同的数据。view
方法创建一个新数组对象,该对象看到相同的数据。与前一种情况不同,新数组的维数更改不会更改原始数据的维数,但是新数组数据更改后,也会影响原始数据。
c = a.view() c is a Out[171]: False c.base is a Out[172]: True c.flags.owndata Out[173]: False c.shape = 2,3 #c的维度更改,a的维度不变 a.shape Out[174]: (3, 2) c[0,1] = 1234 #c的值变化,a的值也变化 a Out[175]: array([[ 12, 1234], [ 2, 3], [ 4, 5]])
深复制
copy
方法生成数组及其数据的完整拷贝。
d = a.copy() d Out[176]: array([[ 12, 1234], [ 2, 3], [ 4, 5]]) d is a Out[177]: False d.base is a Out[178]: False d[0,0] = 9999 #修改数组d的值,a不会受影响 d Out[179]: array([[9999, 1234], [ 2, 3], [ 4, 5]]) a Out[180]: array([[ 12, 1234], [ 2, 3], [ 4, 5]])