2012-05-24 36 views

Trả lời

41

Đó là cố ý.

Toán tử += duy trì loại mảng. Nói cách khác, một mảng các số nguyên vẫn là một mảng các số nguyên.

Điều này cho phép NumPy thực hiện thao tác += bằng bộ nhớ mảng hiện có. Mặt khác, a=a+b tạo một mảng hoàn toàn mới cho tổng, và rebinds a để trỏ đến mảng mới này; điều này làm tăng dung lượng lưu trữ được sử dụng cho hoạt động.

Để trích dẫn documentation:

Cảnh báo: Trong hoạt động nơi sẽ thực hiện việc tính toán bằng cách sử dụng chính xác bởi các kiểu dữ liệu của hai toán hạng quyết định, nhưng âm thầm sẽ downCast kết quả (nếu cần thiết) để nó có thể vừa với mảng. Do đó, để tính toán chính xác hỗn hợp, A {op}= B có thể khác với A = A {op} B. Ví dụ: giả sử a = ones((3,3)). Sau đó, a += 3j khác với a = a + 3j: trong khi cả hai đều thực hiện cùng một tính toán, a += 3 cho kết quả phù hợp trở lại trong a, trong khi a = a + 3j liên kết lại tên a với kết quả.

Cuối cùng, nếu bạn đang tự hỏi tại sao a là một mảng số nguyên ở nơi đầu tiên, hãy xem xét những điều sau đây:

In [3]: np.arange(5).dtype 
Out[3]: dtype('int64') 

In [4]: np.arange(5.0).dtype 
Out[4]: dtype('float64') 
+0

Tôi hiểu rằng a là một số nguyên, tuy nhiên, kết quả mong đợi trong Python khi thêm phao và số nguyên là một phao, vì vậy đây là một "tính năng" bất ngờ " – Dhara

+4

@Dhara: Tôi đồng ý rằng điều này có thể bất ngờ khi gặp phải lần đầu tiên . Nó cũng có thể hữu ích. Ở mức nào, tôi đã thêm một trích dẫn từ tài liệu giải thích hành vi. – NPE

+0

Hoạt động tại chỗ có thể nhanh hơn nhiều (không phân bổ, sử dụng bộ nhớ cache tốt hơn) và nếu bạn có thể giữ tất cả các tham chiếu hiện có cho mảng này (nếu bạn có cấu trúc dữ liệu lông). Ngoài ra chúng cũng rất hữu ích cho các lập trình viên từ các nền C/C++/Fortran. –

8

@aix là hoàn toàn đúng. Tôi chỉ muốn chỉ ra điều này không phải là duy nhất để numpy. Ví dụ:

>>> a = [] 
>>> b = a 
>>> a += [1] 
>>> print a 
[1] 
>>> print b 
[1] 
>>> a = a + [2] 
>>> print a 
[1, 2] 
>>> print b 
[1] 

Như bạn thấy += đổi danh sách và + tạo ra một danh sách mới. Nắm giữ này cũng là một sự náo nhiệt. + tạo một mảng mới để nó có thể là bất kỳ loại dữ liệu nào. += sửa đổi mảng inplace và nó không thực tế, và imo mong muốn, cho numpy để thay đổi kiểu dữ liệu của một mảng khi nội dung mảng được sửa đổi.

+0

Điểm tốt, cảm ơn – Dhara

Các vấn đề liên quan