2013-10-30 57 views
59

例如,如果我们有一个numpy数组A,并且我们想要一个具有相同元素的numpy数组BNumpy数组赋值与副本

这些方法有什么区别?什么时候分配额外的内存,什么时候不分配?

  1. B = A
  2. B[:] = A(同B[:]=A[:]?)
  3. numpy.copy(B, A)

回答

69

所有三个版本做不同的事情。

  1. 这将一个新名称B已命名A现有对象。之后,他们会引用同一个对象,因此如果您修改了某个对象,您也会看到另一个对象的变化。

  2. 这会将A中的值复制到现有阵列B中。这两个阵列必须具有相同的形状才能工作。 B[:] = A[:]做同样的事情(但B = A[:]会做更像1)。

  3. 这不是合法的语法。你可能意思是B = numpy.copy(A)。这与2几乎相同,但它会创建一个新阵列,而不是重新使用B阵列。如果没有其他引用的值为B,则最终结果与2相同,但在复制过程中会临时使用更多内存。

    编辑:或者你的意思是numpy.copyto(B, A),这是合法的,相当于2?

+0

'B = A [:]'_不_做同样的事情在1所有!试试'a = [1,2,3]; b = a [:];在b.append(4);打印(B);打印的(a)'。它定义了一个新的参考并将其复制到其中。 –

+4

@Mr_and_Mrs_D:Numpy数组的工作方式与列表不同。切片数组不会创建副本,只会创建现有数组数据的新视图。 – Blckknght

+3

哦,我纠正了 - 谢谢。让我们在这里保留我的错误,因为许多python程序员会想知道:) –

18
  1. B=A创建参考
  2. B[:]=A使深层副本
  3. numpy.copy(B,A)使副本

最后两个需要额外的内存。

编辑:看看这个Question

4

这是我唯一的工作答案:

B=numpy.array(A)