python - 用 X 相邻值的平均值替换 Numpy 数组中大于阈值的所有元素

标签 python arrays numpy replace conditional-statements

我有一个包含数据集的 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/

相关文章:

python - 将 numpy 数组放入多处理队列的困难

python - django FieldError : Cannot resolve keyword 'category_name_contains' into field. 选项为 : category, 描述、id、图像、名称、订单、价格

python - 如何在 bottle 中使用 jinja2 i18n(带 babel)

变量更改时的python信号?

php - 如何将 php 数组与 sql IN 运算符一起使用?

javascript - 将 JavaScript 拆分成小部分以添加到数组中

python - numpy 中的弃用警告

python - 替换满足特定阈值的python ndarray的值

python - 如何向 Qthread 发送参数

javascript - JSON 解析错误 : Unable to parse JSON string