2014-09-16 18 views
40

Tôi là một người mới bắt đầu với numpy, và tôi đang cố gắng trích xuất một số dữ liệu từ một mảng lâu dài. Những gì tôi cần làm là bắt đầu từ một vị trí xác định trong mảng của tôi, và sau đó subsample tất cả các điểm dữ liệu thứ n từ vị trí đó, cho đến khi kết thúc mảng của tôi.subsampling mỗi mục thứ n trong một mảng numpy

về cơ bản nếu tôi có

a = [1,2,3,4,1,2,3,4,1,2,3,4....] 

Tôi muốn subsample này để bắt đầu tại a[1] và sau đó lấy mẫu tất cả các điểm thứ tư từ đó, để tạo ra một cái gì đó giống như

b = [2,2,2.....] 

Trả lời

72

Bạn có thể sử dụng numpy's slicing, đơn giản start:stop:step.

>>> xs 
array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]) 
>>> xs[1::4] 
array([2, 2, 2]) 

này tạo ra một xem của dữ liệu gốc, vì vậy nó hằng số thời gian. Nó cũng sẽ phản ánh thay đổi đối với mảng ban đầu và giữ toàn bộ mảng ban đầu trong bộ nhớ:

>>> a 
array([1, 2, 3, 4, 5]) 
>>> b = a[::2]   # O(1), constant time 
>>> b[:] = 0   # modifying the view changes original array 
>>> a     # original array is modified 
array([0, 2, 0, 4, 0]) 

vì vậy nếu một trong các điều trên là một vấn đề, bạn có thể tạo một bản sao một cách rõ ràng:

>>> a 
array([1, 2, 3, 4, 5]) 
>>> b = a[::2].copy() # explicit copy, O(n) 
>>> b[:] = 0   # modifying the copy 
>>> a     # original is intact 
array([1, 2, 3, 4, 5]) 

Đây không phải là thời gian cố định, nhưng kết quả không được gắn với mảng ban đầu. Bản sao cũng tiếp giáp trong bộ nhớ, có thể làm cho một số thao tác nhanh hơn.

+0

cảm ơn bạn đã cảnh báo về bản sao tham chiếu/giá trị. tôi chắc chắn sẽ rơi vào cái bẫy – Chris

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