2012-02-24 38 views
12

Lực lượng thường xuyên đè nặng bên trái và bên phải của phép gán để khớp, ví dụ: nếu tôi a[:] = b, b phải có cùng hình dạng hoặc phát sóng có cùng hình dạng a. Nhưng có vẻ là một ngoại lệ cho quy tắc rằng:Lập chỉ mục và chỉ định ưa thích của Numpy

>>> a = np.arange(10) 
>>> a 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> b = a.copy() 
>>> a[[0,1,2]] = b[::2] 
>>> a 
array([0, 2, 4, 3, 4, 5, 6, 7, 8, 9]) 
>>> a[np.arange(10)] = b[:2] 
>>> a 
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1]) 

Nó có vẻ chỉ làm việc với mảng 1d và chỉ khi có chỉ mục ưa thích ở phía bên trái của công việc, nhưng tôi đã không thể tìm thấy tài liệu cho hành vi này ở bất cứ đâu. Hành vi này có được ghi lại không, nếu có, và ai đó có thể đưa ra ví dụ về thời điểm nó có thể hữu ích không?

Cập nhật:

Dường như kiểu flatiter NumPy cư xử theo cách này cũng vậy, là có một số mối liên hệ giữa flatiter và lập chỉ mục ưa thích mà tôi không biết?

>>> a.flat = [10,11] 
>>> a 
array([10, 11, 10, 11, 10, 11, 10, 11, 10, 11]) 
>>> a.flat[:] = [2,3,4] 
>>> a 
array([2, 3, 4, 2, 3, 4, 2, 3, 4, 2]) 
>>> a.flat = range(100) 
>>> a 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
+3

Bạn đã mô tả chính xác tính năng này - nó chỉ được phép khi thực hiện các nhiệm vụ kết hợp với lập chỉ mục nâng cao trên mảng một chiều. Trong khi tôi chắc chắn tôi đã đọc về điều này trong tài liệu, tôi không thể tìm thấy một liên kết tại thời điểm này. Tôi thấy điều này hữu ích ngay bây giờ và sau đó, mặc dù tôi nghĩ rằng nó sẽ tốt hơn nếu điều này được hỗ trợ bởi một chức năng chuyên dụng và nhiệm vụ thường xuyên vẫn sẽ đưa ra một lỗi. –

+0

Phải, tôi nhanh chóng giả định nó chỉ là phát sóng nhưng tôi thấy bây giờ nó không thực sự đáp ứng các yêu cầu phát sóng! Kỳ dị! – wim

+0

Tôi không chắc chắn đó là một tính năng hay một lỗi ... ít nhất, http://docs.scipy.org/doc/numpy/reference/internals.code-explanations.html#getting-or-setting có vẻ không đề cập đến điều này như một trường hợp đặc biệt. – Tanriol

Trả lời

1

Tôi nghĩ hành vi này được mô hình hóa trên R và tổ tiên S/S-plus của nó. Đó là cách gán danh sách (gán "vector") hoạt động ở đó và được gọi là "tái chế". Trang web của dự án R nói về nó, nhưng tôi đã tìm thấy một lời giải thích rõ ràng hơn ở số this link. Trong R, một véc tơ là một tập hợp các phép đo, do đó, nó có ý nghĩa để pad hoặc cắt nó theo cách của nó. Bao nhiêu logic này đã khiến nó trở nên uể oải, và tại sao, vẫn là một câu hỏi hay.

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