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

Posted

技术标签:

【中文标题】对numpy数组中的每个第n个条目进行二次采样【英文标题】:subsampling every nth entry in a numpy array 【发布时间】: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.....]

【问题讨论】:

【参考方案1】:

您可以使用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])

这不是恒定时间,但结果与原始数组无关。该副本在内存中也是连续的,这可以使其上的某些操作更快。

【讨论】:

感谢您对参考/价值副本发出警告。否则我肯定会落入陷阱 a[::2].copy() 解决了我的问题。当我使用 ctypes 将它作为一个 numpy 数组导入 C 时,只有 a[::2],我得到的结果几乎是垃圾(我的数组被读取,就好像我从未减少它一样)。如果我通过 numpy.clip() 运行它或在 for 循环中显式复制每个变量,这也是可以修复的。不确定这是否是一个错误..

以上是关于对numpy数组中的每个第n个条目进行二次采样的主要内容,如果未能解决你的问题,请参考以下文章

如何对二维多边形进行二次采样?

变长df二次采样函数r

使用邻域和对 3D 数组进行二次采样

如何根据数组的密度对数组进行二次采样? (去除频繁值,保留稀有值)

对稀疏 scipy 矩阵进行切片以对每 10 行和每列进行二次采样

我们如何在列的每个值中对 pandas 数据框进行二次采样