2012-09-27 18 views
6

Tôi đang cố gắng cắt một mảng cứng nhắc bằng cách sử dụng một lát được xác định trước trong một biến. Đây hoạt động:Cắt gọt định từ biến số

b = fromfunction(lambda x,y: 10*x+y, (5,4),dtype=int) # Just some matrix 

b[1:3,1:3] 
# Output: 
# array([[11, 12], 
#  [21, 22]]) 

Nhưng những gì tôi muốn làm là somthing như thế này:

slice = "1:3,1:3" 
b[slice] 
# Output: 
# array([[11, 12], 
#  [21, 22]]) 

Nó không phải là quan trọng với tôi những gì loại slice biến có, tôi chỉ sử dụng một chuỗi như một ví dụ. Làm cách nào để lưu một trình định dạng slice như vậy?

Trả lời

13

Bạn có thể sử dụng được xây dựng trong slice chức năng

s = slice(1,3) 
b[s,s] 

ds = (s,s) 
b[ds] 
+0

Hoàn hảo. Tôi đã được nhìn vào chức năng lát, nhưng rõ ràng là không đủ chặt chẽ :-) Cảm ơn (Tôi sẽ chấp nhận ngay khi bộ đếm thời gian cho phép tôi). – XerXes

7

numpy.s_ and numpy.index_exp cung cấp một cách thuận tiện để làm điều này:

the_slice = numpy.index_exp[1:3, 1:3] 
b[the_slice] 

Họ không thể làm bất cứ điều gì mà bạn không thể làm với một kết hợp của slice, tuples, NoneEllipsis, nhưng chúng cho phép bạn sử dụng chính xác cú pháp tương tự như bạn sẽ sử dụng để cắt mảng (sự khác biệt duy nhất giữa s_index_exp là dành cho một lát một chiều, s_ trả về một đối tượng lát, trong khi index_exp kết thúc nó trong một bộ tuple).

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