Sto implementando un algoritmo che richiede di guardare sottomodelli consecutivi non sovrapposti all'interno di un array numpy (strettamente bidimensionale). ad esempio, per il 12 da 12Indici di sottomatrici di dimensioni fisse di array numpy
>>> a = np.random.randint(20, size=(12, 12)); a
array([[ 4, 0, 12, 14, 3, 8, 14, 12, 11, 18, 6, 6],
[15, 13, 2, 18, 15, 15, 16, 2, 9, 16, 6, 4],
[18, 18, 3, 8, 1, 15, 14, 13, 13, 13, 7, 0],
[ 1, 9, 3, 6, 0, 4, 3, 15, 0, 9, 11, 12],
[ 5, 15, 5, 6, 4, 4, 18, 13, 10, 17, 11, 8],
[13, 17, 8, 15, 17, 12, 7, 1, 13, 15, 0, 18],
[ 2, 1, 11, 12, 3, 16, 11, 9, 10, 15, 4, 16],
[19, 11, 10, 7, 10, 19, 7, 13, 11, 9, 17, 8],
[14, 14, 17, 0, 0, 0, 11, 1, 10, 14, 2, 7],
[ 6, 15, 6, 7, 15, 19, 2, 4, 6, 16, 0, 3],
[ 5, 10, 7, 5, 0, 8, 5, 8, 9, 14, 4, 3],
[17, 2, 0, 3, 15, 10, 14, 1, 0, 7, 16, 2]])
e guardando sottomatrici 3x3, vorrei la prima sottomatrice 3x3 ad essere dall'angolo in alto a sinistra:
>>> a[0:3, 0:3]
array([[ 4, 0, 12],
[15, 13, 2],
[18, 18, 3]])
Il prossimo lungo da dare da a[0:3, 3:6]
e così via. Non importa se l'ultima serie di indici di ciascuna riga o colonna viene eseguita alla fine dell'array - il comportamento di numpy di dare semplicemente la porzione all'interno della slice esistente è sufficiente.
Desidero un modo per generare questi indici di sezione in modo programmatico per matrici e sottomatrici di dimensioni arbitrarie. Attualmente ho questo:
size = 3
x_max = a.shape[0]
xcoords = range(0, x_max, size)
xcoords = zip(xcoords, xcoords[1:])
e similmente per generare y_coords
, in modo che la serie di indici è dato da itertools.product(xcoords, ycoords)
.
La mia domanda è: c'è un modo più diretto per farlo, forse usando numpy.mgrid
o qualche altra tecnica numpy?
FYI, ho appena controllato e [la risposta di Saulio] (http://stackoverflow.com/a/16715845/310165) è circa 3-4 volte più veloce del mio metodo 'map', se tutto ciò di cui hai bisogno sono i blocchi . – Geoff