2013-10-17 19 views
6

Cộng bằng nhau là đưa ra một câu trả lời khác với việc gán cho số tiền rõ ràng (đó là câu trả lời mong đợi), khi cắt có liên quan. Có một lý do cho điều này? Nên cộng bằng nhau được tránh?Numpy - hành vi kỳ lạ với cộng bằng cách cắt

a = np.arange(10) 
b = np.arange(10) 
a[3:] += a[:-3] 
b[3:] = b[3:] + b[:-3] 
print a 
#[ 0 1 2 3 5 7 9 12 15 18] 
print b 
#[ 0 1 2 3 5 7 9 11 13 15] 
+4

vì bạn đang thay đổi tại chỗ trong trường hợp 1 ... – JBernardo

+0

Ah, tôi hoàn toàn nhìn thấy nó ngay bây giờ - sửa đổi bổ sung khi bạn đi. Vì vậy, tôi đoán câu trả lời là để tránh cộng bằng nhau khi bạn có hành vi tự tham chiếu (điều đó có nghĩa là tĩnh). Cảm ơn-- – brasqueychutter

Trả lời

3

Khi JBernardo nhận xét, += thay đổi mảng tại chỗ.

a[3:] += [a:-3] cũng tương tự như sau:

>>> import numpy as np 
>>> a = np.arange(10) 
>>> 
>>> for i in range(3, 10): 
...  print('a[{}] ({}) += a[{}] ({})'.format(i, a[i], i-3, a[i-3])) 
...  a[i] += a[i-3] 
...  print(' a[{}] -> {}'.format(i, a[i])) 
... 
a[3] (3) += a[0] (0) 
    a[3] -> 3 
a[4] (4) += a[1] (1) 
    a[4] -> 5 
a[5] (5) += a[2] (2) 
    a[5] -> 7 
a[6] (6) += a[3] (3) 
    a[6] -> 9 
a[7] (7) += a[4] (5) # NOTE: not (4) 
    a[7] -> 12 
a[8] (8) += a[5] (7) 
    a[8] -> 15 
a[9] (9) += a[6] (9) 
    a[9] -> 18 

Để tránh điều đó, sử dụng bản sao của mảng:

>>> a = np.arange(10) 
>>> a[3:] += np.copy(a[:-3]) # OR np.array(a[:-3]) 
>>> a 
array([ 0, 1, 2, 3, 5, 7, 9, 11, 13, 15]) 
+0

Giải thích rõ ràng và rõ ràng. Và lời nhắc hữu ích về cú pháp sao chép ... – brasqueychutter

+1

Một vấn đề khác với + = để xem ra ở đây là bởi vì nó ở đúng vị trí, nó không quảng bá kiểu dtype theo cách phân công bình thường. Vì vậy, một cái gì đó như 'a = np.arange (10); a * = np.pi' sẽ không làm những gì bạn có thể muốn. – Evan

+0

Ah, rất hữu ích để biết. Cảm ơn bạn, Evan, cho tip. – brasqueychutter