在一个数字数组中对每个 n 项进行子抽样

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

如果我有的话

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

我想从 a[1]开始再次抽样,然后每四分之一的样本从那里开始,产生类似的东西

b = [2,2,2.....]
206287 次浏览

您可以使用 麻麻在切片,简单地使用 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])

这不是常量时间,但结果不与原始数组绑定。该副本在内存中也是连续的,这可以使对它的某些操作更快。

明白了,这就是努里的回答的补充: 如果您想控制最终元素的数量,并确保它始终固定在一个预定义的值上(而不是控制子样本之间的固定步骤) ,那么可以使用 Numpy 的 linspace方法,然后进行整数舍入。

例如,使用 num _ element = 4:

>>> a
array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> choice = np.round(np.linspace(1, len(a)-1, num=4)).astype(int)
>>> a[choice]
array([ 2,  5,  7, 10])

或者,对具有最终起始点/终结点的数组进行子采样:

>>> import numpy as np
>>> np.round(np.linspace(0, len(a)-1, num=4)).astype(int)
array([0, 3, 6, 9])
>>> np.round(np.linspace(0, len(a)-1, num=15)).astype(int)
array([0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9])