2013-10-30 60 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)