【问题标题】:Replace all elements of Numpy array greater than threshold with average of X adjacent values用X个相邻值的平均值替换大于阈值的Numpy数组的所有元素
【发布时间】:2019-12-08 09:26:27
【问题描述】:
我有这个包含数据集的 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])
谢谢!
【问题讨论】:
标签:
python
arrays
numpy
replace
conditional-statements
【解决方案1】:
你可以这样做:
X = 2 #set number of adjacent values
calc_avg = lambda x: (sum([array[x+a]+array[x-a] for a in range(1, X+1)]))/4
array[array > 16384] = [calc_avg(x[0]) for x in np.where(array > 16384)]
这可能会遇到问题,但如果您被截断值之前/之后没有 2 个数字!
【解决方案2】:
这样就可以了
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]