关于numpy的浅拷贝

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

示例:

import numpy as np
a=np.array([1,2,3])
b=[]
for i in range(0,2):
    a+=1
    b.append(a)
print(b)

运行结果为:

[array([3, 4, 5]), array([3, 4, 5])]

使用copy方法以获得深拷贝。

import numpy as np
a=np.array([1,2,3])
b=[]
for i in range(0,2):
    a+=1
    b.append(a.copy())
print(b)

运行结果为:

[array([2, 3, 4]), array([3, 4, 5])]

另外,转为list也可以避免浅拷贝。

import numpy as np
a=np.array([1,2,3])
b=[]
for i in range(0,2):
    a+=1
    b.append(a.tolist())
print(b)

运行结果为:

[[2, 3, 4], [3, 4, 5]]

补充

有一个和上述问题类似的现象,当我想创建一个双层列表时,我一开始是这样做的,但是并不正确,因为列表中的所有元素都是同时变化的。

lists = [[]]*3
lists[0].append('1')
print(lists)

它的输出是:[['1'], ['1'], ['1']]

用下面这种方法才可以创建相互独立的元素。

lists = [[] for _ in range(0,3)]
lists[0].append('1')
print(lists)

运行结果为[['1'], [], []]

原文地址:https://www.cnblogs.com/dingdangsunny/p/15124539.html