繁体   English   中英

用最近邻居的中位数替换列表中的(每个)元素

[英]Replace (every) element in a list by the median of the nearest neighbors

我有一个数组A ,说:

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

我希望通过用A中的四个最近邻居的中位数替换A中的每个元素来创建新数组B而不考虑给定位置的值...例如:

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

问题是我需要在一个巨大的A上执行此操作,并且我想优化时间,所以我想避免for循环或类似事件。 而且...我不在乎边缘的结果。

我已经尝试过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] ,这显然不是正确的答案。 任何想法都欢迎。

正在使用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)

我将以熊猫为中心滚动一个长度为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM