用NumPy方法从非均匀采样数据生成均匀采样数组

2024-04-27 17:08:41 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是我想减少绘图和分析的数据量。我使用Python和Numpy。数据采样不均匀,因此有一个时间戳数组和一个相应值数组。我希望数据点之间至少有一定的时间间隔。我在这里有一个用Python编写的简单解决方案,在这些示例之间至少有一秒钟的时间可以找到指示符:

import numpy as np

t = np.array([0, 0.1, 0.2, 0.3, 1.0, 2.0, 4.0, 4.1, 4.3, 5.0 ]) # seconds
v = np.array([0, 0.0, 2.0, 2.0, 2.0, 4.0, 4.0, 5.0, 5.0, 5.0 ])

idx = [0]
last_t = t[0]
min_dif = 1.0 # Minimum distance between samples in time
for i in range(1, len(t)):
    if last_t + min_dif <= t[i]:
        last_t = t[i]
        idx.append(i)

如果我们看看结果:

^{pr2}$

问题是如何才能更有效地实现这一点,尤其是在数组非常长的情况下?有没有一些内置的NumPy或SciPy方法可以做类似的事情?在


Tags: 数据innumpy绘图间隔np时间数组
3条回答

我想不出一个解决方案可以完全满足您的需要,但是虽然它对我来说并不太简单,但它应该可以在不进行插值的情况下实现您想要的结果。每秒钟最多给出一个值(最左边):

# Assuming that t is sorted...
# Create all full seconds.
seconds = np.arange(int(t[0]), int(t[-1]) + 1)

# find the indexes for all
idx = np.searchsorted(t, seconds)
idx = np.unique(idx) # there might be duplicates if a second has no data in it.

对于您的例子,它给出了相同的结果,但是它通常允许更小或更大的差异(0到2秒之间的任何值)。。。在

一个简单的解决方案是通过插值,例如numpy.interp

vsampled = numpy.interp(numpy.arange(t[0], t[-1]), t, v)

不过,这不会给您提供值的索引。但是,它将通过插值生成值,即使是对于输入数组中没有数据的t中的点。在

虽然,像@1443118,我建议使用pandas,但是您可能想尝试使用np.histogram的东西。在

首先,了解您需要的箱子数量(间隔为min_difs):

>>> bins = np.arange(t[0], t[-1]+min_dif, min_dif) - 1e-12

t[-1]+min_dif是为了确保我们得到最后一点,-1e-12一个黑客,以避免你的例子的4.0计算在最后一个箱子里:这只是一个偏移量,以确保我们关闭右边的间隔。在

^{pr2}$

所以,v[0:4]是你的第一个样本,v[4:5]你的第二个。。。你明白了。在

相关问题 更多 >