2015-05-14 16 views
7

Tôi tự hỏi liệu có thể lưu trữ ký hiệu slice numpy trong từ điển python hay không. Một cái gì đó như:Ký hiệu slice NumPy trong từ điển

lookup = {0:[:540], 
      30:[540:1080], 
      60:[1080:]} 

Có thể sử dụng cú pháp lát trăn gốc, ví dụ: slice(0,10,2), nhưng tôi đã không thể lưu trữ các lát phức tạp hơn. Ví dụ, một cái gì đó là đa chiều [:,:2,:, :540].

Công việc hiện tại của tôi xung quanh là lưu trữ các giá trị dưới dạng bộ dữ liệu và sau đó giải nén chúng thành các lát cần thiết.

Làm việc bằng Python 2.x.

+0

Tôi muốn đặt lại câu hỏi để tập trung hoàn toàn vào cách lưu trữ một biểu thức slice. +1 một trong hai cách – PascalVKooten

+1

Bạn có thể sử dụng một tuple của 'slice' để làm cho nó hoạt động với nhiều dimentions – RafaelC

+1

Bạn có thể sử dụng lambdas và truyền mảng –

Trả lời

9

Cú pháp [:, :2, :, :540] được biến thành một tuple của slice đối tượng bằng Python:

(slice(None, None, None), 
slice(None, 2, None), 
slice(None, None, None), 
slice(None, 540, None)) 

Một cách thuận tiện để tạo tuple này là sử dụng các chức năng đặc biệt * np.s_. Bạn chỉ cần vượt qua biểu thức [...]. Ví dụ:

>>> np.s_[:540] 
slice(None, 540, None) 
>>> np.s_[:, :2, :, :540] 
(slice(None, None, None), 
slice(None, 2, None), 
slice(None, None, None), 
slice(None, 540, None)) 

Rồi từ điển của bạn lát có thể được viết như sau:

lookup = {0: np.s_[:540], 
      30: np.s_[540:1080], 
      60: np.s_[1080:]} 

* kỹ thuật s_ là một bí danh cho lớp IndexExpression mà thực hiện một phương pháp đặc biệt __getitem__.

+0

Tôi không biết về' np.s_', tuyệt đối tuyệt vời vì nó cho phép dễ đọc hơn đối với một người không thoải mái với ký pháp trăn thuần túy. – Jzl5325

+0

Tôi đã đề nghị viết một lớp tùy chỉnh với một 'def __getitem __ (self, item): return item' đơn giản, nhưng tôi đoán đó là cơ bản' s_' làm gì. Không biết về điều đó! –

2

NumPy có rất nhiều Indexing routines .Và trong trường hợp này bạn có thể sử dụng các chức năng sau cho Tạo mảng chỉ mục:

c_: Dịch vật lát để nối dọc theo trục thứ hai.

r_: Dịch các đối tượng lát để nối dọc theo trục đầu tiên.

s_: Cách tốt hơn để tạo bộ chỉ mục cho mảng.

Bạn cũng có thể sử dụng numpy.unravel_index:

Chuyển đổi một tuple của mảng chỉ số vào một loạt các chỉ số căn hộ, áp dụng chế độ ranh giới để đa-index.

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