6

问题是我想减少绘图和分析的数据量。我正在使用 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)

如果我们看一下结果:

--> print idx
[0, 4, 5, 6, 9]

--> print t[idx]
[ 0.  1.  2.  4.  5.]

问题是如何才能更有效地做到这一点,特别是如果数组真的很长?是否有一些内置的 NumPy 或 SciPy 方法可以做类似的事情?

4

4 回答 4

4

虽然像 @1443118 一样,我建议使用pandas,但您可能想尝试使用np.histogram.

首先,了解min_dif您需要的 bin 数量(s 的间隔):

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

t[-1]+min_dif是为了确保我们采取最后一点,-1e-12避免将4.0您的示例计入最后一个 bin 的技巧:这只是确保我们关闭右侧间隔的偏移量。

>>> (counts, _) = np.histogram(t, bins)
>>> counts
array([4, 1, 1, 0, 3])
>>> counts.cumsum()
array([4, 5, 6, 6, 9])

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

于 2012-08-23T13:11:43.383 回答
3

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

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

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

于 2012-08-21T13:46:21.607 回答
1

我想不出一个完全符合您要求的解决方案,但是虽然它对我来说似乎不太优雅,但这应该可以在不进行插值的情况下大致完成您想要的。它将每秒最多给出一个值(最左边):

# 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秒之间的任何东西)......

于 2012-08-21T14:26:27.093 回答
1

我建议为此使用熊猫。生成规则间隔的时间序列然后将数据重新采样到某个特定频率非常简单。请参阅 内容并查看关于在页面下方重新采样的小节。

于 2012-08-21T15:12:25.350 回答