2016-12-14 68 views
0

我有一個數據集,其時間爲t,數據爲d。不幸的是,我在一段時間後改變了輸出數據的速度(最初速度太高)。我想對數據進行採樣,以便有效地移除高頻導出的數據,但在結束時保持低頻導出的數據。Python:相對於數據集統一切片陣列

考慮下面的代碼:

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

可你['np.interp'(HTTPS://docs.scipy .org/doc/numpy/reference/generated/numpy.interp.html)的數據? – mgilson

+0

我更喜歡保留原始數據。 – Charlie

+0

當然,但是如果你正確地處理你想要維護的點,那麼你應該沒有問題... – mgilson

回答

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

我認爲in1d是一個好主意,一旦我知道't_desired'是什麼,但這是我想到的最棘手的部分。有沒有辦法自動確定't_desired'? – Charlie

+0

這是你的數據集,不知道我該如何回答。你的時間數據是否均勻分佈? – innisfree

+0

不,時間數據不是均勻間隔的,這就是點。 – Charlie