Cách đơn giản nhất để giải thích câu hỏi của tôi có thể được với một ví dụ, vì vậy hãy để tôi xác định một số mảng:Làm thế nào để sạch mảng index NumPy với mảng (hoặc bất cứ điều gì khác mà hỗ trợ bổ sung để nó có thể được bù đắp)
>>> test = arange(25).reshape((5,5))
>>> test
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
>>> Xinds = array([1,2,3])
>>> Yinds = array([1,2,3])
Bây giờ, nếu tôi muốn các yếu tố trong các hàng 1, 2, 3 và trong cột 0, tôi có thể đi:
>>> test[Yinds,0]
array([ 5, 10, 15])
Nếu tôi muốn các mục trong hàng 1, 2, 3 và tất cả các cột, Tôi có thể đi:
>>> test[Yinds, :]
array([[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
Tuy nhiên, nếu tôi cố gắng mở rộng điều này để có được các thành phần trong hàng 1, 2 và 3 và cột 1, 2 và 3, - bất ngờ! - Tôi thay vì có được các yếu tố trong (1,1), (2,2), và (3,3)
>>> test[Yinds, Xinds]
array([ 6, 12, 18])
Thay vì những gì tôi muốn:
>>> test[Yinds, :][:, Xinds]
array([[ 6, 7, 8],
[11, 12, 13],
[16, 17, 18]])
>>> test[1:4,1:4]
array([[ 6, 7, 8],
[11, 12, 13],
[16, 17, 18]])
Tôi nhận ra tôi có thể xác định một lát, nhưng tôi muốn có thể thêm một bù đắp cho các chỉ mục (ví dụ Yinds + offset), và điều đó không thể được thực hiện với các slice.
tôi có thể làm một cái gì đó giống như
>>> xStart = 1
>>> xEnd = 4
>>> yStart = 1
>>> yEnd = 4
>>> offset = 1
>>> test[yStart+offset:yEnd+offset, xStart+offset:xEnd+offset]
...
hoặc
>>> Xinds = array([1,4])
>>> Yinds = array([1,4])
>>> offset = 1
>>> test[slice(*(Yinds+offset)), slice(*(Xinds+offset))]
...
Nhưng không phải là đặc biệt sạch.
Khỉ vá toán tử bổ sung vào slice không có vẻ là một tùy chọn và kế thừa từ slice để thêm toán tử cũng không hoạt động; Tôi nhận được lỗi, "loại 'lát' không phải là một loại cơ sở chấp nhận được". (* Càu nhàu * Đây không phải là vấn đề trong Ruby * Grumble *)
Vì vậy, câu hỏi của tôi là, cách sạch nhất để truy cập mảng phụ (nhiều hơn 1 chiều) với thứ gì đó có thể được lưu trữ và bù lại?
Tùy chọn cho đến nay:
- thử nghiệm [Yinds + bù đắp,:] [:, Xinds + bù đắp]
- thử nghiệm [yStart + offset: yEnd + bù đắp, xStart + offset: xEnd + bù đắp]
- thử nghiệm [lát (* (Yinds + bù đắp)), lát (* (Xinds + bù đắp))]
Điều đó dường như là những gì tôi đang tìm kiếm. Cảm ơn. – lnmaurer