Как вычислить среднее значение ближайших соседей в массиве в numpy

#python #arrays #numpy #numpy-ndarray

#python #массивы #numpy #numpy-ndarray

Вопрос:

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

Что я имею в виду под этим в случае данного массива размерности 2, так это то, что если массив имеет форму (n, m) с записями a_{i,j}, то для записи (i,j) значение нового массива должно быть:

среднее (i, j) = 1/4 (a_{i 1,j} a_{i-1,j} a_{i,j 1} a_{i,j-1}),

где первый индекс берется по модулю n, а второй по модулю m.

Я хотел бы создать функцию, аргументом которой является произвольный массив, которая возвращает массив одинаковой формы и вводит средние значения по записям ближайших соседей данного массива (для d-мерного массива есть 2d ближайших соседей, полученных путем суммирования 1 и -1 по каждому индексу)

Я знаю, как это сделать для фиксированного измерения d (просто обобщая приведенное выше уравнение), используя d вложенных циклов for , но я не знаю, как это сделать, когда размеры не являются фиксированными.

Комментарии:

1. Проверьте convolve с правильным ядром.

Ответ №1:

В Scipy есть функция scipy.ndimage.convolve, которая может сделать именно это. для этого требуется массив и матрица значений для умножения соседей. Это должно работать для любого количества измерений.

Однако, если вы пытаетесь написать эту функцию вручную, я бы предложил попробовать итеративный или рекурсивный подход, при котором каждая итерация или уровень рекурсии обрабатывает измерение. В случае 3D вы сначала обработаете первое измерение и получите одну шестую от значения соседей в этом измерении. Следующая итерация будет делать то же самое для измерения 2 и т.д.

Коэффициент для умножения каждого соседа равен 1 / (2n), поскольку каждая запись имеет 2 соседей в каждом измерении. Это должно масштабироваться до любого произвольного числа измерений.