2017-02-23 12 views
0

我有一個numpy的數組:循環在陣列上通過重疊視窗

seq = np.array(range(1,31)) 

In [24]: seq 
Out[24]: array([ 1, 2, 3, ..., 28, 29, 30]) 

我想將其分割成重疊的(或不重疊)長度爲n的區段。

n=7 
overlap = 3 
windowed_seq = windowing(seq,n,overlap) 

In [24]: windowed_seq 
Out[24]: [ 1, 5, ..., 17, 21, 
      2, 6, ..., 18, 22, 
      3, 7, ..., 19, 23, 
      4, 8, ..., 20, 24, 
      5, 9, ..., 21, 25, 
      6, 10, ..., 22, 26, 
      7, 11, ..., 23, 27] 

最後一欄:

25, 
26, 
27, 
28, 
29, 
30, 
31, 
?] 

被省略,因爲一個元素缺少完成窗口..

我發現在互聯網上該解決方案,但它不與陣列工作...

https://www.safaribooksonline.com/library/view/python-cookbook-2nd/0596007973/ch19s08.html

import itertools 
def windows(iterable, length=2, overlap=0): 
    it = iter(iterable) 
    results = list(itertools.islice(it, length)) 
    while len(results) == length: 
     yield results 
     results = results[length-overlap:] 
     results.extend(itertools.islice(it, length-overlap)) 
    if results: 
     yield results 
if _ _name_ _ == '_ _main_ _': 
    seq = 'foobarbazer' 
    for length in (3, 4): 
     for overlap in (0, 1): 
      print '%d %d: %s' % (length, overlap, 
        map(''.join, windows(seq, length, overlap))) 

你能幫我讓它爲我的數組工作嗎?

+0

你能顯示一個輸入與預期的輸出? – NoobEditor

+0

@NoobEditor我編輯的問題與預期的輸出 – gabboshow

回答

2

您可以使用scikit圖像的view_as_windows

import skimage 
import numpy 

data = numpy.arange(1, 31) 
print skimage.util.view_as_windows(data, 7, step=3).T 

產生

[[ 1 4 7 10 13 16 19 22] 
[ 2 5 8 11 14 17 20 23] 
[ 3 6 9 12 15 18 21 24] 
[ 4 7 10 13 16 19 22 25] 
[ 5 8 11 14 17 20 23 26] 
[ 6 9 12 15 18 21 24 27] 
[ 7 10 13 16 19 22 25 28]] 

如果你想確保你的陣列也正是你的窗口長度的倍數就可以使用

data = numpy.append(data, numpy.repeat(numpy.nan, len(data) % 7)) 

之後你的輸出變成

[[ 1. 4. 7. 10. 13. 16. 19. 22. 25.] 
[ 2. 5. 8. 11. 14. 17. 20. 23. 26.] 
[ 3. 6. 9. 12. 15. 18. 21. 24. 27.] 
[ 4. 7. 10. 13. 16. 19. 22. 25. 28.] 
[ 5. 8. 11. 14. 17. 20. 23. 26. 29.] 
[ 6. 9. 12. 15. 18. 21. 24. 27. 30.] 
[ 7. 10. 13. 16. 19. 22. 25. 28. nan]] 
+0

超!謝謝! – gabboshow