Python:相对于数据集统一切片数组

时间:2016-12-14 00:11:48

标签: python arrays distribution post-processing

我的数据集有时间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

1 个答案:

答案 0 :(得分:1)

你有2d数据,例如,

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)]