2015-08-13 28 views
19

Tôi đang sử dụng python 2.7.3, khi tôi thực hiện các đoạn mã sau:mảng NumPy, sự khác biệt giữa một/= x vs a = a/x

import numpy as np 

a = np.array([[1,2,3],[4,5,6]]) 
a = a/float(2**16 - 1) 
print a 

Điều này sẽ dẫn ông sau đầu ra:

>> array([[1.52590219e-05, 3.05180438e-05, 4.57770657e-05], 
>>  [6.10360876e-05, 7.62951095e-05, 9.15541314e-05]]) 

Đúng như mong đợi, tuy nhiên khi tôi thực hiện đoạn mã sau:

import numpy as np 

a = np.array([[1,2,3],[4,5,6]]) 
a /= float(2**16 - 1) 
print a 

tôi nhận được kết quả như sau:

>> array([[0, 0, 0], 
>>  [0, 0, 0]]) 

tôi mong đợi đầu ra tương tự như trong ví dụ trước, tôi không hiểu ouput khác nhau, trong đó có vẻ là một kết quả của việc sử dụng a /= float(2**16 - 1) vs a = a/float(2**16 - 1).

+1

[Tôi mở lại này . Nó liên quan đến bản sao được đề xuất ban đầu, nhưng không có câu trả lời cho câu hỏi đó giải quyết vấn đề dtype liên quan. Có lẽ một bản sao khác ở đâu đó, nhưng không phải là một.] – DSM

+0

@DSM Đồng ý, câu hỏi được liên kết thực sự không giải thích những gì đang diễn ra ở đây. Nó giải thích lý do tại sao * có thể * là một kết quả khác, nhưng không * tại sao * nó xảy ra trong trường hợp này. – poke

+0

Câu hỏi liên quan: [Hành vi không mong muốn đối với phân chia tự numpy] (http://stackoverflow.com/q/15907484/832621) –

Trả lời

29

From the 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ả.

Vì mảng của bạn là một mảng các số nguyên, khi sử dụng các phép toán tại chỗ, kết quả sẽ được chuyển xuống các số nguyên một lần nữa.

Nếu bạn thay đổi mảng của bạn để nó lưu trữ nổi ban đầu, sau đó kết quả (trong đó có phao) có thể được lưu trữ trong mảng ban đầu, và mã của bạn sẽ hoạt động tốt:

>>> a = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) 
>>> a /= float(2**16 - 1) 
>>> a 
array([[ 1.52590219e-05, 3.05180438e-05, 4.57770657e-05], 
     [ 6.10360876e-05, 7.62951095e-05, 9.15541314e-05]]) 
Các vấn đề liên quan