2017-02-23 2 views
0

Ich habe eine numpy Array:Looping auf einer Anordnung von überlappenden Fenstern

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

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

Ich mag es wäre in überlappende (oder nicht überlappend) Segmenten der Länge n partitionieren.

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] 

Die letzte Spalte:

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

weggelassen, da ein Element fehlt, das Fenster zu vervollständigen ..

fand ich diese Lösung im Internet, aber es mit Array funktioniert nicht ...

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))) 

Können Sie mir helfen, es für mein Array arbeiten zu lassen?

+0

können Sie eine Eingabe mit erwarteter Ausgabe anzeigen? – NoobEditor

+0

@NoobEditor Ich habe die Frage mit der erwarteten Ausgabe – gabboshow

Antwort

2

Sie können view_as_windows scikit Image verwenden:

import skimage 
import numpy 

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

ergibt

[[ 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]] 

Wenn Sie Ihr Array sicherstellen möchten, dass genau ein Vielfaches Ihres windowlength können Sie

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

, danach wird Ihr Ausgang

[[ 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

super bearbeitet! Vielen Dank! – gabboshow

Verwandte Themen