2013-10-30 14 views
59

Ví dụ, nếu chúng ta có một mảng có kích thước A, và chúng tôi muốn một mảng có khối lượng B có cùng các yếu tố.gán mảng Numpy với bản sao

Sự khác biệt giữa các phương pháp này là gì? Khi nào bộ nhớ bổ sung được cấp phát, và khi nào nó không được?

  1. B = A
  2. B[:] = A (giống như B[:]=A[:]?)
  3. numpy.copy(B, A)

Trả lời

69

Cả ba phiên bản đều làm những việc khác nhau.

  1. Điều này liên kết tên mới B với đối tượng hiện có đã đặt tên A. Sau đó, chúng đề cập đến cùng một đối tượng, vì vậy nếu bạn sửa đổi một vị trí, bạn sẽ thấy sự thay đổi thông qua một đối tượng khác.

  2. Điều này sao chép các giá trị từ A vào mảng hiện có B. Hai mảng phải có hình dạng giống nhau để làm việc. B[:] = A[:] thực hiện điều tương tự (nhưng B = A[:] sẽ làm điều gì đó giống như 1).

  3. Đây không phải là cú pháp hợp pháp. Bạn có thể có nghĩa là B = numpy.copy(A). Điều này gần giống như 2, nhưng nó tạo ra một mảng mới, thay vì tái sử dụng mảng B. Nếu không có tham chiếu nào khác đến giá trị B trước đó, kết quả cuối cùng sẽ bằng 2, nhưng nó sẽ sử dụng nhiều bộ nhớ tạm thời hơn trong bản sao.

    Chỉnh sửa: hoặc có thể bạn có nghĩa là numpy.copyto(B, A), hợp pháp và tương đương với 2?

+0

'B = A [:] 'không _not_ làm điều tương tự như 1 ở tất cả! Hãy thử 'a = [1, 2, 3]; b = a [:]; b.append (4); in (b); in (a) '. Nó định nghĩa một tham chiếu mới và sao chép vào nó. –

+4

@Mr_and_Mrs_D: Các mảng nhiều lần hoạt động khác với danh sách. Cắt một mảng không tạo bản sao, nó chỉ tạo ra một khung nhìn mới trên dữ liệu của mảng hiện có. – Blckknght

+3

Ồ, tôi đã sửa chữa - cảm ơn. Hãy giữ lỗi của tôi ở đây như nhiều người lập trình python sẽ tự hỏi :) –

18
  1. B=A tạo ra một tài liệu tham khảo
  2. B[:]=A tạo một bản sao sâu
  3. numpy.copy(B,A) tạo một bản sao

hai điều cuối cùng cần thêm bộ nhớ.

EDIT: Hãy xem điều này Question

4

Đây là câu trả lời duy nhất làm việc cho tôi:

B=numpy.array(A)