python - 用最近邻居的中位数替换列表中的(每个)元素
问题描述
我有一个数组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]
,这显然不是正确的答案。欢迎任何想法。
解决方案
途中可以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)
推荐阅读
- excel - 找不到单元格大于某个值的第一行
- sql - Postgresql 从包含数组的表中选择与数组中一样多的行
- excel - 如何在 VueJS 项目的 web-worker 中读取 Excel 文件
- c# - 服务堆栈 [必需] 注释不起作用
- node.js - 如何在 Heroku 上部署 NodeJs、Socket 应用程序而不会出现任何错误?
- gradle - 找不到 Gradle 子模块
- linux - 带有连字符和空格的 grep 正则表达式
- recursion - 在 ASM 和 LC3 中使用堆栈进行递归编程
- php - 将字符串从 ISO-8859-1 转换为 UTF8
- php - 按钮重定向到 php 文件