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)]
我有一个包含时间 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)]