2017-04-03 2 views
1

Ich habe einen 2-D-numpy Array dieser Form:Schiebefenster aus 2D-Array, das einer 3D-Anordnung entlang der Achse = 0 oder Reihen gleitet geben

[[ 0. 1. 2. 3. 4.] 
[ 5. 6. 7. 8. 9.] 
[ 10. 11. 12. 13. 14.] 
[ 15. 16. 17. 18. 19.] 
[ 20. 21. 22. 23. 24.] 
[ 25. 26. 27. 28. 29.] 
[ 30. 31. 32. 33. 34.] 
[ 35. 36. 37. 38. 39.] 
[ 40. 41. 42. 43. 44.] 
[ 45. 46. 47. 48. 49.]] 

I eine Ansicht der Anordnung konstruieren will, Gruppierung seiner Elemente in einem beweglichen Fenster (in meinem Beispiel Größe 4). Mein Ergebnis sollte (6, 4, 5) der Form sein, und ich kann es konstruieren wie folgt:

res = [] 
mem = 4 
for i in range(mem, X.shape[0]+1): 
    res.append(X[i-mem:i, : ]) 
res = np.asarray(res) 
print res.shape 

Ich möchte Umschichtung vermeiden, so frage ich mich, ob ich eine Ansicht konstruieren kann dieses Ergebnis zu geben, mit as_strided zum Beispiel.

Eine Erklärung des Prozesses ist sehr willkommen.

Dank

Antwort

3

Hier ist ein Ansatz mit np.lib.stride_tricks.as_strided angefordert -

def strided_axis0(a, L): 
    # INPUTS : 
    # a is array 
    # L is length of array along axis=0 to be cut for forming each subarray 

    # Length of 3D output array along its axis=0 
    nd0 = a.shape[0] - L + 1 

    # Store shape and strides info 
    m,n = a.shape 
    s0,s1 = a.strides 

    # Finally use strides to get the 3D array view 
    return np.lib.stride_tricks.as_strided(a, shape=(nd0,L,n), strides=(s0,s0,s1)) 

Probelauf -

In [48]: X = np.arange(35).reshape(-1,5) 

In [49]: X 
Out[49]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24], 
     [25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34]]) 

In [50]: strided_axis0(X, L=4) 
Out[50]: 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]], 

     [[ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]], 

     [[10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24], 
     [25, 26, 27, 28, 29]], 

     [[15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24], 
     [25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34]]]) 
+0

Vielen Dank Divakar! – volatile

Verwandte Themen