Per l'esempio, è possibile utilizzare numpy.lib.stride_tricks.as_strided.
In [1]: A = np.arange(16).reshape(4, 4)
In [2]: A
Out[2]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [3]: strides = A.itemsize * np.array([8, 2, 4, 1])
In [4]: x = p.lib.stride_tricks.as_strided(A, shape = (2, 2, 2, 2), strides = strides)
In [4]: x
Out[4]:
array([[[[ 0, 1],
[ 4, 5]],
[[ 2, 3],
[ 6, 7]]],
[[[ 4, 5],
[ 8, 9]],
[[ 6, 7],
[10, 11]]]])
In [5]: x.reshape(4, 2, 2)
Out[5]:
array([[[ 0, 1],
[ 4, 5]],
[[ 2, 3],
[ 6, 7]],
[[ 8, 9],
[12, 13]],
[[10, 11],
[14, 15]]])
I passi definiscono offset in byte da utilizzare quando attraversano la matrice, e la funzione as_strided
consente di creare un nuovo array con passi dall'utente definire.
Tuttavia, non so quanto sia efficiente e quanto bene si ridimensionerà per il vostro uso.
Correlati: http://stackoverflow.com/q/16856788/190597 – unutbu
Grazie. Applicare la media due volte sull'asse 1 con il metodo su quella pagina ha funzionato. – Auxiliary
Un'altra versione correlata per mettere quei blocchi come colonne: http://stackoverflow.com/questions/30109068/implement-matlabs-im2col-sliding-in-python. Semplifica le operazioni che potresti desiderare di bloccare a mano in senso vettoriale operando in seguito sull'asse 0-esimo. – Divakar