python复制和拷贝
当运算和处理数组时,它们的数据有时被拷贝到新的数组有时不是。这有三种情况:
完全不拷贝
简单的赋值不拷贝数组对象或它们的数据。
a = arange(12)
b = a # no new object is created
b is a # a and b are two names for the same ndarray object
'''
True
'''
b.shape = 3,4 # changes the shape of a
a.shape
'''
(3, 4)
'''
Python 传递不定对象作为参考,所以函数调用不拷贝数组。
def f(x):
print (id(x))
id(a)
'''
4538177536
'''
f(a)
'''
4538177536
'''
视图(view)和浅复制
不同的数组对象分享同一个数据。视图方法创造一个新的数组对象指向同一数据。
c = a.view()
c is a
'''
False
'''
c.base is a # c is a view of the data owned by a
'''
True
'''
c.shape = 2,6 # a's shape doesn't change
a.shape
'''
(3, 4)
'''
c[0,4] = 1234 # a's data changesa
a
'''
array([[ 0, 1, 2, 3],
[1234, 5, 6, 7],
[ 8, 9, 10, 11]])
'''
切片数组返回它的一个视图:
s = a[ : , 1:3] # spaces added for clarity; could also be written "s = a[:,1:3]"
s[:] = 10 # s[:] is a view of s. Note the difference between s=10 and s[:]=10
a
'''
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
'''
深复制
这个方法完全复制数组和它的数据。
d = a.copy() # a new array object with new data is created
d is a
'''
False
'''
d.base is a # d doesn't share anything with a
'''
False
'''
d[0,0] = 9999
a
'''
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
'''