2011-09-06 47 views
8

Giả sử tôi đã xác định một mảng 3x3x3 NumPy vớiNumPy mảng đa chiều slicing

x = numpy.arange(27).reshape((3, 3, 3)) 

Bây giờ, tôi có thể nhận được một mảng chứa các (0,1) yếu tố của mỗi mảng con 3x3 với x[:, 0, 1], mà trả về array([ 1, 10, 19]). Nếu tôi có một bộ (m, n) và muốn lấy phần tử (m, n) của mỗi mảng con (0,1) được lưu trữ trong một bộ tuple thì sao? Ví dụ, giả sử rằng tôi có t = (0, 1). Tôi đã thử x[:, t], nhưng nó không có hành vi đúng - nó trả về hàng 0 và 1 của mỗi mảng con. Giải pháp đơn giản nhất mà tôi đã tìm thấy là

x.transpose()[tuple(reversed(t))].transpose() 

nhưng tôi chắc chắn phải có cách tốt hơn. Tất nhiên, trong trường hợp này, tôi có thể làm x[:, t[0], t[1]], nhưng điều đó không thể được khái quát hóa trong trường hợp tôi không biết có bao nhiêu kích thước xt có.

Trả lời

9

bạn có thể tạo các tuple chỉ số đầu tiên:

index = (numpy.s_[:],)+t 
x[index] 
+0

mát, nhờ sự giúp đỡ (bạn cũng vậy, wim). Tôi tìm thấy nhiều ví dụ hơn cho s_ và slice tại [scipy] (http://www.scipy.org/Numpy_Example_List). Tôi nghĩ rằng tôi đã xem qua danh sách đó trước đây, nhưng không thấy bất cứ điều gì có vẻ phù hợp. – James

4

giải pháp HYRY là đúng, nhưng tôi đã luôn luôn tìm thấy r_, c_s_ chỉ số thủ thuật NumPy để có một chút kỳ lạ tìm kiếm. Vì vậy, đây là điều tương đương sử dụng một đối tượng slice:

x[(slice(None),) + t] 

Đó đối số duy nhất để cắt là vị trí dừng (tức None nghĩa là tất cả trong cùng một cách mà x[:] tương đương với x[None:None])