Mam tablicę i chciałbym utworzyć mniejszą tablicę, skanując nienakładające się okna 2x2 i uzyskując maksimum. Oto przykład:Windowed maximum in numpy
import numpy as np
np.random.seed(123)
np.set_printoptions(linewidth=1000,precision=3)
arr = np.random.uniform(-1,1,(4,4))
res = np.zeros((2,2))
for i in xrange(res.shape[0]):
for j in xrange(res.shape[1]):
ii = i*2
jj = j*2
res[i][j] = max(arr[ii][jj],arr[ii+1][jj],arr[ii][jj+1],arr[ii+1][jj+1])
print arr
print res
więc macierz tak:
[[ 0.393 -0.428 -0.546 0.103]
[ 0.439 -0.154 0.962 0.37 ]
[-0.038 -0.216 -0.314 0.458]
[-0.123 -0.881 -0.204 0.476]]
powinno stać się w ten sposób:
[[ 0.439 0.962]
[-0.038 0.476]]
Jak mogę to zrobić bardziej efektywnie?
Czy możesz pokazać nam, co próbujesz i dlaczego nie zadziałało? –
powyższy kod wykonuje wymagane zadanie, ale musi być szybkie i dlatego chciałbym usunąć pętlę for. –
Rozważ użycie [NumBa] (http://numba.pydata.org/). Możesz zostawić podwójną pętlę tak, jak jest, dodaj około 10 znaków w dekoratorze i uzyskaj wydajność podobną do C. Łatwe w użyciu, gotowe do użycia, jeśli korzystasz z dystrybucji Continuum Analytics "[" Anaconda "] (https://store.continuum.io/cshop/anaconda/) dystrybucji Pythona. – ely