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