lấy mẫu con mọi mục nhập thứ n trong một mảng numpy


93

Tôi là 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 dài numpy. 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, sau đó lấy mẫu con mỗi điểm dữ liệu thứ n từ vị trí đó, cho đến khi kết thúc mảng của tôi.

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 lấy mẫu phụ này để bắt đầu a[1]và sau đó lấy mẫu mỗi điểm thứ tư từ đó, để tạo ra một cái gì đó như

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

Câu trả lời:


154

Bạn có thể sử dụng cách cắt của numpy một cách đơ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])

Điều này tạo ra một chế độ xem dữ liệu gốc, vì vậy nó là thời gian không đổi . Nó cũng sẽ phản ánh các 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 những điều trên là sự cố, bạn có thể tạo một bản sao 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 bị ràng buộc với mảng ban đầu. Bản sao cũng liền kề trong bộ nhớ, điều này có thể thực hiện một số thao tác trên đó nhanh hơn.


1
cảm ơn bạn đã cảnh báo về bản sao tham chiếu / giá trị. i nếu không sẽ chắc chắn rơi vào cái bẫy
Chris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.