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

时间:2014-09-16 19:11:26

标签: python arrays numpy

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

基本上如果我有

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

我希望对此进行子采样,从a[1]开始,然后从那里开始每隔四个点采样,以产生类似

的内容
b = [2,2,2.....]

1 个答案:

答案 0 :(得分:109)

您可以使用numpy's slicing,只需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])

这不是固定时间,但结果与原始数组无关。该副本在内存中也是连续的,可以更快地对其进行一些操作。