我有一个包含数据集的 Numpy 数组
array = np.array([3147, 3228, 3351, 3789, 4562, 4987, 5688, 6465, 7012, 7560, 7976, 8615, 8698, 8853, 8783, 8949, 9066, 9123, 9172, 9411, 9717, 9696, 9848,10113, 10154, 10227, 10439, 10672, 10287, 10386, 10417, 10585, 10607,10461, 10654, 10739, 10634, 10490, 10544, 10645, 10392, 10330, 10044, 9560, 8711, 8152, 7506, 7191, 6994, 6601, 6609, 6670, 7293, 32767, 7264, 7262, 7503 ,7872, 7826, 8037])
绘制时,它给出了一个平滑的分布,但异常值 32767
出现尖峰。目前我有这个将任何大于 16384
阈值的像素设置为零。
array[array > 16384] = 0
如果像素高于阈值,我该如何更改它以便替换值是 X 左右值的平均值?如果离群点位于第一个索引或最后一个索引处,则平均值应该恰好位于有值的一侧。也可能有多个值大于阈值(在这个例子中只有一个)
使用 2 个相邻的左右值的示例输入的预期输出将计算为 (6670 + 7293 + 7264 + 7262)/4 = 7122.25
以获得此结果
array = np.array([3147, 3228, 3351, 3789, 4562, 4987, 5688, 6465, 7012, 7560, 7976, 8615, 8698, 8853, 8783, 8949, 9066, 9123, 9172, 9411, 9717, 9696, 9848,10113, 10154, 10227, 10439, 10672, 10287, 10386, 10417,10585, 10607,10461, 10654, 10739, 10634, 10490, 10544, 10645, 10392, 10330, 10044, 9560, 8711, 8152, 7506, 7191, 6994, 6601, 6609, 6670, 7293, 7122, 7264, 7262, 7503 ,7872, 7826, 8037])
谢谢!
最佳答案
这行得通
def remove_outlier_pixels(array, adjacent=2):
outliers = np.argwhere(array > 16384)
for outlier in outliers:
outlier = int(outlier)
left = array[outlier-adjacent:outlier]
right = array[outlier+1:outlier+adjacent+1]
array[outlier] = (left.sum() + right.sum())/(left.size + right.size)
return array
用 X 左右相邻值对所有大于阈值的像素取平均值。如果较高的阈值位于第一个或最后一个索引处,还需要处理极端情况
使用这个输入
[99999 3228 3351 3789 4562 4987 5688 6465 7012 7560 7976 8615 8698 8853 8783 8949 9066 37000 9172 9411 9717 9696 9848 10113 10154 10227 10439 10672 10287 10386 10417 10585 10607 10461 10654 10739 10634 10490 10544 10645 10392 10330 10044 9560 8711 8152 7506 7191 6994 6601 6609 6670 7293 32767 7264 7262 7503 7872 7826 88888]
我们得到
[ 3289 3228 3351 3789 4562 4987 5688 6465 7012 7560 7976 8615 8698 8853 8783 8949 9066 9149 9172 9411 9717 9696 9848 10113 10154 10227 10439 10672 10287 10386 10417 10585 10607 10461 10654 10739 10634 10490 10544 10645 10392 10330 10044 9560 8711 8152 7506 7191 6994 6601 6609 6670 7293 7122 7264 7262 7503 7872 7826 7849]
关于python - 用 X 相邻值的平均值替换 Numpy 数组中大于阈值的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57280937/