Câu hỏi cơ bản là: Điều gì xảy ra dưới mui xe khi thực hiện: a[i] += b
?Hoạt động tại chỗ của numpy (ví dụ: `+ =`) hoạt động như thế nào?
Do sau:
import numpy as np
a = np.arange(4)
i = a > 0
i
= array([False, True, True, True], dtype=bool)
Tôi hiểu rằng:
a[i] = x
cũng giống nhưa.__setitem__(i, x)
, mà gán trực tiếp đến các mục được chỉ định bởii
a += x
được giống nhưa.__iadd__(x)
bổ sung tại chỗ
Nhưng những gì xảy ra khi tôi làm:
a[i] += x
Cụ thể:
- Đây có phải là giống như
a[i] = a[i] + x
? (Mà không phải là một hoạt động tại chỗ) - Liệu nó tạo sự khác biệt trong trường hợp này nếu
i
là:- một chỉ số
int
, hoặc - một
ndarray
, hoặc - một đối tượng
slice
- một chỉ số
nền
Lý do tôi bắt đầu đào sâu vào việc này là tôi gặp phải một hành vi phi trực quan khi làm việc với các chỉ số trùng lặp:
a = np.zeros(4)
x = np.arange(4)
indices = np.zeros(4,dtype=np.int) # duplicate indices
a[indices] += x
a
= array([ 3., 0., 0., 0.])
thứ Thú vị hơn về chỉ số trùng lặp trong this question.
Tôi không thấy sự cố với ví dụ nền của bạn. Nó rõ ràng cần phải lặp nội bộ trên tất cả các giá trị. Nếu bạn chỉ định các giá trị cho một mảng như là một hoạt động tại chỗ, trong đó tất cả các chỉ số đều giống nhau, thì giá trị cuối cùng sẽ là phần còn lại. Điều này rõ ràng những gì xảy ra (giá trị cuối cùng của 'x' clobbers tất cả phần còn lại). –
Ồ, tôi thấy vấn đề. Nếu nội bộ bạn đang thực sự viết lại cho bộ nhớ kết quả của hoạt động, bạn mong đợi để xem tổng của tất cả các giá trị trong 'x'. hmmm ... –
@HenryGomersall, chính xác. – shx2