Answers:
这三个版本都做不同的事情:
B = A
这会将新名称绑定B
到已经命名的现有对象A
。之后,它们引用同一个对象,因此,如果您就地修改一个对象,那么您也会在另一个对象中看到更改。
B[:] = A
(与B[:]=A[:]
?相同)
这会将值从中复制A
到现有数组中B
。两个数组必须具有相同的形状才能起作用。B[:] = A[:]
做同样的事情(但B = A[:]
会做更多类似1的事情)。
numpy.copy(B, A)
这不是合法的语法。你可能是说B = numpy.copy(A)
。这几乎与2相同,但是它创建了一个新数组,而不是重用该B
数组。如果没有其他对先前B
值的引用,则最终结果将与2相同,但是在复制期间它将临时使用更多内存。
也许您是说numpy.copyto(B, A)
,这是合法的,等于2?
but B = A[:] would do something more like 1
?根据此stackoverflow.com/a/2612815 new_list = old_list[:]
也是副本。
some_array[:]
将创建一个新的数组对象,但是该新对象将是与原始数组相同内存的视图,该内存不会被复制。这就是为什么我说它更像是B = A
。它仅占用O(1)
空间和时间,而不O(n)
需要真正副本所需的时间和空间。
B=A
创建参考B[:]=A
复制numpy.copy(B,A)
复制后两个需要额外的内存。
要制作深拷贝,您需要使用 B = copy.deepcopy(A)
B[:] = A
它不使对象类型,例如数组的深层副本A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
。现在尝试B[:] = A; B[0][0]=99
,这将同时更改A和B中的第一个元素!据我所知,没有其他方法可以保证深度复制,甚至是一个numpy数组,也只能保证copy.deepcopy