Numpy Методы улучшения моей функции скользящего среднего - PullRequest
0 голосов
/ 09 марта 2020

У меня есть функция для вычисления скользящего среднего для numpy массивов, импортированных из файла. Эта функция работает нормально, но мне было интересно, если кто-нибудь знает более быстрый метод, используя один из numpy методов, чтобы получить тот же результат ??

Данные:

b = [[1, 2, 3],
 [2, 3, 4],
 [3, 4, 5],
 [6, 7, 8],
 [4, 5, 6]]

def mod_movAvg(arr):
    rowNum, colNum = arr.shape
    res = np.zeros((rowNum - 1, colNum))
    for col in range(colNum):
        for row in range(rowNum - 1):
            res[row][col] = 0.5*(arr[row][col] + arr[row+1][col])
    return res

вывод:

[[1.5 2.5 3.5]
 [2.5 3.5 4.5]
 [4.5 5.5 6.5]
 [5.  6.  7. ]]

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Convolution является ключевым словом здесь. У вас есть двумерный массив, но вы сверните только вдоль одной оси, поэтому, возможно, этот вопрос актуален.

  • для 1D свертки вы можете использовать numpy.convolve()
  • для 2D свертки вы можете использовать scipy.signal.covolve2d()

В вашем случае вы перемещаете ядро ​​с формой (2,1)

[[0.5],[0.5]]

по массиву, чтобы получить значения

res[row][col] = 0.5*arr[row][col] + 0.5*arr[row+1][col]

Применительно к вашему примеру:

import scipy.signal as sg

b = [[1, 2, 3],
     [2, 3, 4],
     [3, 4, 5],
     [6, 7, 8],
     [4, 5, 6]]

res = sg.convolve2d(b, [[0.5], [0.5]], mode='valid')

Этот подход быстро и легко обобщить:

kernel = (3, 2)
sg.convolve2d(arr, np.full(kernel, 1/np.size(kernel)), mode='valid')
0 голосов
/ 09 марта 2020

Во-первых, b можно преобразовать в матрицу numpy (которая более эффективно хранится в памяти), используя:

b = np.matrix(b)

Затем вы можете просто сделать то, что хотите, более эффективно, используя:

result = 0.5 * (b[:-1,:] + b[1:,:])

result также будет numpy матрицей.

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