簡體   English   中英

如何將三維滑動窗口陣列展平為二維陣列?

[英]How to flatten a 3d array of sliding window into 2d array?

我在python(Keras)中使用Autoencoder LSTM。 我有一個多變量輸入,我使用滑動窗口方法將其轉換為正確的LSTM輸入格式。 最后,我得到的輸出形狀與窗口相同。 然后我想將此數組轉換為原始輸入形狀。 任何人都可以幫我,我該怎么做?

這是我在多變量信號上放置滑動窗口的代碼:


def window(samples, windows_size, step):
    m, n = samples.shape 
    print("\nold shape: ", m, "*", n)
    num_signals = n    
    num_samples = (samples.shape[0] - windows_size) // step + 1
    aa = np.empty([num_samples, windows_size, num_signals])

    for j in range(num_samples):
        for i in range(num_signals):
            aa[j, :, i] = samples[(j * step):(j * step + windows_size), i]
    samples = aa
    m ,n, k = samples.shape
    print("new shape: ", m, "*", n, "*", k)
    return samples

x = np.asarray([[1,0.1,0.1],[2,0.2,0.2],[3,0.3,0.3],[4,0.4,0.4],
                [5,0.5,0.5],[6,0.6,0.6],[7,0.7,0.7],[8,0.8,0.8]])

window(x, 3, 2)

old shape:  8 * 3
new shape:  3 * 3 * 3
Out[65]: 
array([[[1. , 0.1, 0.1],
        [2. , 0.2, 0.2],
        [3. , 0.3, 0.3]],

       [[3. , 0.3, 0.3],
        [4. , 0.4, 0.4],
        [5. , 0.5, 0.5]],

       [[5. , 0.5, 0.5],
        [6. , 0.6, 0.6],
        [7. , 0.7, 0.7]]])

你可以用這個:

注意:stride與CNN中的概念相同,是您跳過以獲取下一個窗口的元素數。

inp = np.array([[[1. , 0.1, 0.1],
        [2. , 0.2, 0.2],
        [3. , 0.3, 0.3]],

       [[3. , 0.3, 0.3],
        [4. , 0.4, 0.4],
        [5. , 0.5, 0.5]],

       [[5. , 0.5, 0.5],
        [6. , 0.6, 0.6],
        [7. , 0.7, 0.7]]])
def restitch(array, stride):
    flat = array.flatten().reshape(-1,array.shape[2])
    keep = [i for i in range(len(flat)) if not(i%(stride+1)==0 and i>0)]
    return flat[keep]

restitch(inp, 2)
array([[1. , 0.1, 0.1],
       [2. , 0.2, 0.2],
       [3. , 0.3, 0.3],
       [4. , 0.4, 0.4],
       [5. , 0.5, 0.5],
       [6. , 0.6, 0.6],
       [7. , 0.7, 0.7]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM