例如,如果我们有 numpy 数组 A ,并且我们想要一个具有相同元素的 numpy 数组 B .
numpy
A
B
以下(见下文)方法有什么区别?什么时候分配额外的内存,什么时候不分配?
B = A
B[:] = A (与 B[:]=A[:] 相同?)
B[:] = A
B[:]=A[:]
numpy.copy(B, A)
所有三个版本都做不同的事情:
这会将新名称 B 绑定到已命名为 A 的现有对象 . 之后他们引用同一个对象,所以如果你修改了一个对象,你也会看到另一个对象的变化 .
这会将 A 中的值复制到现有数组 B 中 . 这两个数组必须具有相同的形状才能工作 . B[:] = A[:] 做同样的事情(但 B = A[:] 会做更像1的事情) .
B[:] = A[:]
B = A[:]
这不是合法的语法 . 你可能意味着 B = numpy.copy(A) . 这几乎与2相同,但它创建了一个新数组,而不是重用 B 数组 . 如果没有其他对前一个 B 值的引用,则最终结果将与2相同,但在复制期间它将临时使用更多内存 .
B = numpy.copy(A)
或者你的意思是 numpy.copyto(B, A) ,这是合法的,相当于2?
numpy.copyto(B, A)
B=A 创建引用
B=A
B[:]=A 制作副本
B[:]=A
numpy.copy(B,A) 复制
numpy.copy(B,A)
最后两个需要额外的内存 .
要制作深层副本,您需要使用 B = copy.deepcopy(A)
B = copy.deepcopy(A)
这是我唯一可行的答案:
B=numpy.array(A)
3 回答
所有三个版本都做不同的事情:
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?B=A
创建引用B[:]=A
制作副本numpy.copy(B,A)
复制最后两个需要额外的内存 .
要制作深层副本,您需要使用
B = copy.deepcopy(A)
这是我唯一可行的答案: