【发布时间】:2014-11-10 16:01:12
【问题描述】:
我是 numpy 的初学者,我正在尝试从一个长的 numpy 数组中提取一些数据。我需要做的是从数组中定义的位置开始,然后从该位置对每个第 n 个数据点进行二次采样,直到数组结束。
如果我有的话
a = [1,2,3,4,1,2,3,4,1,2,3,4....]
我想从a[1] 开始对其进行二次采样,然后从那里每隔四个点采样一次,以产生类似
b = [2,2,2.....]
【问题讨论】:
我是 numpy 的初学者,我正在尝试从一个长的 numpy 数组中提取一些数据。我需要做的是从数组中定义的位置开始,然后从该位置对每个第 n 个数据点进行二次采样,直到数组结束。
如果我有的话
a = [1,2,3,4,1,2,3,4,1,2,3,4....]
我想从a[1] 开始对其进行二次采样,然后从那里每隔四个点采样一次,以产生类似
b = [2,2,2.....]
【问题讨论】:
您可以使用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])
这不是恒定时间,但结果与原始数组无关。该副本在内存中也是连续的,这可以使其上的某些操作更快。
【讨论】: