È possibile utilizzare una vista di dimensione superiore della matrice e prendere la media lungo le dimensioni extra:
In [12]: a = np.arange(36).reshape(6, 6)
In [13]: a
Out[13]:
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, 35]])
In [14]: a_view = a.reshape(3, 2, 3, 2)
In [15]: a_view.mean(axis=3).mean(axis=1)
Out[15]:
array([[ 3.5, 5.5, 7.5],
[ 15.5, 17.5, 19.5],
[ 27.5, 29.5, 31.5]])
In generale, se si vuole bidoni di forma (a, b)
per una serie di (rows, cols)
, la vostra rimodellamento di esso dovrebbe essere .reshape(rows // a, a, cols // b, b)
. Si noti inoltre che l'ordine di .mean
è importante, ad es. a_view.mean(axis=1).mean(axis=3)
genererà un errore, perché a_view.mean(axis=1)
ha solo tre dimensioni, anche se a_view.mean(axis=1).mean(axis=2)
funzionerà correttamente, ma rende più difficile capire cosa sta succedendo.
Come è, il codice di cui sopra funziona solo se è possibile montare un numero intero di cassonetti all'interno dell'array, vale a dire se a
divide rows
e b
divide cols
. Ci sono modi per gestire altri casi, ma dovrai definire il comportamento che desideri.
Sono le sottomatrici sono garantiti per adattarsi, esattamente? hai numpy 1.7. disponibile (è semplicemente pulito, non necessario)? – seberg
I have numpy 1.8dev ma il mio lavoro diventa versione precedente ... – user1187727