Python:相对于数据集均匀切片数组

Python: slice array uniformly with respect to dataset

我有一个包含时间 t 和数据 d 的数据集。不幸的是,我在一段时间后更改了导出数据的速率(最初速率太高)。我想对数据进行采样,这样我就可以有效地去除高频导出的数据,但在接近尾声的时候保留低频导出的数据。

考虑以下代码:

arr = np.loadtxt(file_name,skiprows=3)

其中t = arr[:,0], d = arr[:,1].

这是一个获得统一切片的函数:

def get_uniform_slices(arr, N_desired_points):
    s = arr.shape
    if s[0] > N_desired_points: 
        n_skip = m.ceil(s[0]/N_desired_points)
    else:                     
        n_skip = 1
    return arr[0::n_skip,:] # Sample output

然而,对于高频导出的数据,数据看起来很好,但对于低频导出的数据来说,数据太稀疏了。

是否有某种切片方式,使索引相对于 t 均匀分布?

非常感谢任何帮助。

这是我用来查找索引的函数,基于已接受的答案:

def get_uniform_index(t,N_desired_points):
    t_uniform = np.linspace(np.amin(t),np.amax(t),N_desired_points)
    t_desired = [nearest(t_d, t) for t_d in t_uniform]
    i = np.in1d(t, t_desired)
    return i

您有二维数据,例如,

t = np.arange(0., 100., 0.5)
d = np.random.rand(len(t))

您只想在均匀间隔时间保留特定的数据值,例如

t_desired = np.arange(0., 100., 1.)

让我们使用 in1d 函数在所需的时间挑选出所需的数据点:

d_pruned = d[np.in1d(t, t_desired)]

当然,您必须选择 t_desired,它们应该与 t 中的值匹配。如果这是一个问题,您可以使用例如

选择大致统一的时间
def nearest(x, arr):
    index = (np.abs(arr - x)).argmin()
    return arr[index]

t_uniform = np.arange(0., 100., 1.)
t_desired = [nearest(t_d, t) for t_d in t_uniform] 

完整代码如下:

import numpy as np

t = np.arange(0., 100., 0.5)
d = np.random.rand(len(t))

def nearest(x, arr):
    index = (np.abs(arr - x)).argmin()
    return arr[index]

t_uniform = np.arange(0., 100., 1.)
t_desired = [nearest(t_d, t) for t_d in t_uniform]

d_pruned = d[np.in1d(t, t_desired)]