I am a beginner with numpy, and I am trying to extract some data from a long numpy array. What I need to do is start from a defined position in my array, and then subsample every nth data point from that position, until the end of my array.
basically if I had
a = [1,2,3,4,1,2,3,4,1,2,3,4....]
I want to subsample this to start at
a and then sample every fourth point from there, to produce something like
b = [2,2,2.....]
You can use numpy's slicing, simply
>>> xs array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]) >>> xs[1::4] array([2, 2, 2])
This creates a view of the the original data, so it's constant time. It'll also reflect changes to the original array and keep the whole original array in memory:
>>> 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])
so if either of the above things are a problem, you can make a copy explicitly:
>>> 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])
This isn't constant time, but the result isn't tied to the original array. The copy also contiguous in memory, which can make some operations on it faster.