2017-07-17 43 views
0

我將下面的MATLAB代碼成Python:創建不同大小的hstacks的Python的NP vstack

function segments = segmentSlidingWindow(data, wSize, sSize) 
    len = size(data,1); 
    wCurr = 1; 
    segments = []; % todo: init to make faster 
    while (wCurr<len-wSize) 
     segments = [segments; wCurr wCurr+wSize]; % start stop 
     wCurr = wCurr+sSize; % step forward 
    end 
    segments = [segments; wCurr len]; % add residual 
end 

我寫了下面的Python代碼後的Numpy for Matlab users guide

def sliding_window(data, window_size, step_size): 
    length = data.shape[0] 
    wCurr = 0 
    segments = [] 
    while wCurr < length - window_size: 
     segments = np.vstack([np.hstack([segments]), np.hstack([wCurr, window_size + wCurr])]) 
     wCurr = wCurr + step_size 
    segments = np.vstack([np.hstack([segments]), np.hstack([wCurr, length])]) 
    plt.plot(segments) 
    plt.show() 
    return segments 

我也繪製分段數據以查看其外觀。

segments = np.vstack([np.hstack([segments]), np.hstack([wCurr, window_size + wCurr])]) 

我得到以下錯誤:

ValueError: all the input array dimensions except for the concatenation axis must match exactly 

當我打印length我得到504

我的數據是但是,我不能,因爲上線運行此Python代碼熊貓DataFrame與5列。我只需要在中間三列上有一個滑動窗口,因爲它們是唯一相關的。第一列是時間戳,最後一列是標籤。

wSizesSize是整數。

我想打一個滑動窗口這樣的事情:

1495573445.162, 0, 0.021973, 0.012283, -0.995468, 1 
1495573445.172, 0, 0.021072, 0.013779, -0.994308, 1 
1495573445.182, 0, 0.020157, 0.015717, -0.995575, 1 
1495573445.192, 0, 0.017883, 0.012756, -0.993927, 1 
1495573445.202, 0, 0.021194, 0.012161, -0.994705, 1 
1495573445.212, 0, 0.019638, 0.013718, -0.994019, 1 
1495573445.222, 0, 0.019440, 0.010803, -0.994476, 1 
1495573445.232, 0, 0.018112, 0.010849, -0.993073, 1 
1495573445.242, 0, 0.020157, 0.011154, -0.994644, 1 
1495573445.252, 0, 0.020340, 0.010040, -0.995804, 1 
1495573445.262, 0, 0.017792, 0.009857, -0.996078, 1 
1495573445.272, 0, 0.020538, 0.010239, -0.994858, 1 

,其中輸出將與步長的窗口大小的一半滾動窗口。

+0

你能,請提供一些測試數據(非常小的numpy的陣列? –

+0

你的代碼適用於我的模擬數據:'segments = np.array([[1,2,3,4],[5,6,7,8]])','wCurr = np.array( [[1,2],[3,4]])和'window_size = np.array([[10,20],[30,40]])。然後'segments = np.vstack([np.hstack([segments]),np.hstack([wCurr,window_size + wCurr])])'工作,'segments'的新值爲:'array([[1 ,2,3,4],[5,6,7,8],[1,2,11,22],[3,4,33,44]])' –

+0

您確實需要提供您的示例數據或至少每個輸入陣列的形狀。事實上,形狀就足夠了。 –

回答

1

我有可能是因爲你想用這樣的事情,以取代while循環的感慨:

s = np.arange(0, length - window_size, step_size) 
segments = np.vstack([s, s + window_size]).T 

對於段將是這樣的:

array([[ 0, 6], 
     [ 3, 9], 
     [ 6, 12]]) 

如果您希望轉置答案,在vstack之後刪除.T,獲得:

array([[ 0, 3, 6], 
     [ 6, 9, 12]]) 

如果你真的堅持使用while循環,則:

segments = np.empty((0, 2), dtype=np.int) 
while wCurr < length - window_size: 
    segments = np.vstack([segments, [wCurr, window_size + wCurr]]) 
    wCurr = wCurr + step_size 

或:

segments = np.empty((0, 2), dtype=np.int) 
while wCurr < length - window_size: 
    segments = np.append(segments, [[wCurr, window_size + wCurr]], axis=0) 
    wCurr = wCurr + step_size 
相關問題