Заменить (каждый) элемент в списке медианой ближайших соседей - PullRequest
0 голосов
/ 14 мая 2018

У меня есть массив A, скажем:

import numpy as np
A = np.array([1,2,3,4,5,6,7,8])

И я хочу создать новый массив B, заменив каждый элемент в A медианой его четырех ближайших соседей, без , принимая во внимание значение в данной позиции ... например:

B[2] = np.median([A[0], A[1], A[3], A[4]]) (=3) 

Дело в том, что мне нужно выполнить это на гигантском A, и я хочу оптимизировать время, поэтому я хочу избегать циклов или тому подобного. И ... мне плевать на результат по краям.

Я уже пробовал scipy.ndimage.filters.median_filter, но он не выдает желаемый результат:

import scipy.ndimage
B = scipy.ndimage.filters.median_filter(A,footprint=[1,1,0,1,1],mode='wrap')

, который производит B=[7,4,4,5,6,7,6,6], что явно не правильный ответ. Любая идея приветствуется.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я бы сделал вращающееся центральное окно длиной 5 в пандах и применил бы медианную функцию к значениям окна, средняя часть которого была замаскирована:

import numpy as np
A = np.array([1,2,3,4,5,6,7,8])

mask = np.array(np.ones(5), bool)
mask[5//2] = False

import pandas as pd
df = pd.DataFrame(A)

r5 = df.rolling(5, center=True)

result = r5.apply(lambda x: np.median(x[mask]))

result
     0
0  NaN
1  NaN
2  3.0
3  4.0
4  5.0
5  6.0
6  NaN
7  NaN
0 голосов
/ 14 мая 2018

В пути можно использовать np.roll для смещения числа в вашем массиве, например:

A_1 = np.roll(A,1)
# output: array([8, 1, 2, 3, 4, 5, 6, 7])

И затем то же самое с прокруткой на -2, -1 и 2:

A_2 = np.roll(A,2)
A_m1 = np.roll(A,-1)
A_m2 = np.roll(A,-2)

Теперь вам просто нужно сложить 4 массива, так как для каждого индекса у вас есть 4 соседа в одном из них:

B = (A_1 + A_2 + A_m1 + A_m2)/4.

И, как вы сказали, вам не нужны края, Я думаю, что это работает для вас!

РЕДАКТИРОВАТЬ: я думаю, что я был сосредоточен на скользящей идее, что я смешал среднее значение и медиану, медиана может быть вычислена как B = np.median([A_1,A_2,A_m1,A_m2],axis=0)

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