Python >> Tutoriel Python >  >> Python Tag >> NumPy

Conseils sur la vectorisation des opérations par bloc dans Numpy

En utilisant apply_along_axis , vous pouvez vous débarrasser de cauchy_schwartz . Puisque vous n'êtes pas trop préoccupé par le temps de prétraitement, supposez que vous avez obtenu le tableau params qui contient les patchs aplatis

params = np.random.rand(3,2,100)

comme vous pouvez voir la forme de params est (3,2,100) , les trois nombres 3, 2 et 100 sont juste choisis au hasard pour créer un tableau auxiliaire pour démontrer la logique d'utilisation de apply_along_axis . 3 correspond au nombre de patchs que vous avez (déterminé par la forme du patch et la taille de l'image), 2 correspond aux deux images et 100 correspond aux patchs aplatis. Par conséquent, les axes de params est (idx of patches, idx of images, idx of entries of a flattened patch) , cela correspond exactement à la liste params créé par votre code

params = []
for i in range(0,patch1.shape[0],1):
    for j in range(0,patch1.shape[1],1):
        window1 = np.copy(imga[i:i+N,j:j+N]).flatten()
        window2 = np.copy(imgb[i:i+N,j:j+N]).flatten()
        params.append((window1, window2))

Avec le tableau auxiliaire params , voici ma solution :

hist = np.apply_along_axis(lambda x: np.histogram(x,bins=11)[0],2,params)
hist = hist / np.sum(hist,axis=2)[...,None]

n_d = np.sum(np.product(hist,axis=1),axis=1)
d_d = np.sum(np.product(np.power(hist,2),axis=1),axis=1)
res = -1.0 * np.log10(n_d, d_d)