Как ускорить сумму элементов массива? - PullRequest
0 голосов
/ 05 февраля 2019

Я хотел бы сделать сумму трехмерного массива, но сгруппировать элементы n по n.Явное выполнение этого требует большого времени выполнения.

Я пробовал с Numba, и это не улучшается.С f2py это может работать, но я бы предпочел пропустить его в этом случае.

fsum=np.zeros([N,M,L])
for i in range(0,N):
     for j in range(1,M-1):
       for k in range(0,L):
           for h in range(j-5,j+5):
               fsum[i,j,k]=fsum[i,j,k]+g[i,h,k]

Я хотел бы найти способ написать его таким образом, чтобы улучшить производительность.Как я могу это сделать?

1 Ответ

0 голосов
/ 05 февраля 2019

Если вы можете использовать scipy, тогда есть и свёртка:

import numpy as np
from scipy.ndimage.filters import convolve

Это ваш импульс

g = np.ones((100,100,5) 

Здесь вы определяете «окно» свертки

ker = np.ones((1,11,1)) # = [[[1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1]]]

Затем вы вычисляете свертку с режимом обработки границы

# constant means that a 0-padding will be added to border to compute the convolution
fmat = convolve(g, ker, mode='constant') 

Показать результат

print(fmat)

Ср. Здесь для более подробной информации.

EDIT:

Вы хотите суммировать элементы пять на пять для второго измерения.Таким образом, вы хотите вычислить для каждого пикселя сумму окна 1x11x1 вокруг этого пикселя (это ваш цикл for с диапазоном от j-5 до j + 5).Это может быть вычислено с использованием свертки (например, применение фильтра к изображению является сверткой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...