首页 > 解决方案 > 用最近邻居的中位数替换列表中的(每个)元素

问题描述

我有一个数组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并且我想优化时间,所以我想避免 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],这显然不是正确的答案。欢迎任何想法。

标签: pythonnumpyvectorizationmedian

解决方案


途中可以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)


推荐阅读