对numpy数组中的每个第n个条目进行二次采样


93

我是numpy的初学者,我正在尝试从长的numpy数组中提取一些数据。我需要做的是从数组中定义的位置开始,然后从该位置对第n个数据点进行子采样,直到数组结束。

基本上如果我有

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

我想对此进行二次采样a[1],然后从那里开始每四个点采样一次,以产生类似

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

Answers:


154

您可以简单地使用numpy的切片start:stop:step

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

这将创建原始数据的视图,因此它是恒定时间。它还将反映对原始数组的更改,并将整个原始数组保留在内存中:

>>> 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])

因此,如果以上任何一个问题都存在,您可以显式地制作副本:

>>> 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])

这不是固定的时间,但是结果不依赖于原始数组。副本在内存中也是连续的,这可以使副本上的某些操作更快。


1
感谢您对参考/值副本的警告。否则我肯定会陷入陷阱
克里斯(Chris
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.