2012-06-28 39 views
6

Tôi biết cách lấy x[:,:,:,:,j,:] (lấy phần thứ j của thứ nguyên 4).python: trích xuất một lát của một mảng đa chiều cho chỉ số thứ nguyên

Có cách nào để làm điều tương tự nếu thứ nguyên được biết trong thời gian chạy và không phải là hằng số đã biết không?

+1

Lập chỉ mục trong biểu mẫu 'x [something]' đồng nghĩa với việc gọi phương thức '__getitem__' của đối tượng. Ví dụ, mã trên của bạn tương đương với việc truyền tuple '(slice (None), slice (None), slice (None), slice (None), j, slice (None))' sang 'x .__ getitem __()' . –

+1

@JoelCornett: Tại sao bạn sử dụng '__getitem __()' cho điều này? Lợi thế trên '[]' là gì? –

+0

@SvenMarnach: Tôi sẽ không, tôi chỉ cảm thấy rằng OP sẽ được hưởng lợi từ việc hiểu khái niệm này. Câu trả lời cho câu hỏi của anh ta là tầm thường, nếu anh ta nhận ra nó chỉ là vấn đề chuyển các đối số cho một hàm. –

Trả lời

6

Bạn có thể sử dụng slice chức năng và gọi nó với các danh sách biến thích hợp trong thời gian chạy như sau:

# Store the variables that represent the slice in a list/tuple 
# Make a slice with the unzipped tuple using the slice() command 
# Use the slice on your array 
.210

Ví dụ:

>>> from numpy import * 
>>> a = (1, 2, 3) 
>>> b = arange(27).reshape(3, 3, 3) 
>>> s = slice(*a) 
>>> b[s] 
array([[[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]]) 

Đây là giống như:

>>> b[1:2:3] 
array([[[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]]) 

Cuối cùng, tương đương với không chỉ định bất cứ điều gì giữa 2 : trong cách viết thông thường là đặt None ở những nơi trong tuple bạn tạo nên.

8

Một lựa chọn để làm như vậy là để xây dựng cắt programatically:

slicing = (slice(None),) * 4 + (j,) + (slice(None),) 

Một cách khác là sử dụng numpy.take() hay ndarray.take():

>>> a = numpy.array([[1, 2], [3, 4]]) 
>>> a.take((1,), axis=0) 
array([[3, 4]]) 
>>> a.take((1,), axis=1) 
array([[2], 
     [4]]) 
+0

numpy.take trông giống như điều phù hợp để tôi sử dụng ở đây. –

+0

làm thế nào để bạn sử dụng 'slicing' để trích xuất một cái gì đó từ' x'? –

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