消除1d阵列中的斑点/斑点

时间:2018-05-17 19:27:40

标签: python numpy

我有一个NumPy数组包含一些"坏"值。我想剔除它们。

每个坏的价值的邻居只是顽皮的#34;但我也想剔除它们。

对不良值的可靠测试是:

arr<0.1

然而,唯一可靠的测试(我能想到)对于一个顽皮的价值来说,它是一个坏的价值。

我使用以下策略来消除坏的和顽皮的价值观:

import numpy as np

c     = np.random.random(100) #Construct test data

who = np.where(c<0.1)[0]      #Reliable test for bad values
c[who] = 0                    #Zero bad values
#Add and subtract from the indices of the bad values to cull
#their neighbours
wht = who-1; wht = wht[np.logical_and(0<wht,wht<len(c))]; c[wht]=0
wht = who+1; wht = wht[np.logical_and(0<wht,wht<len(c))]; c[wht]=0
wht = who+2; wht = wht[np.logical_and(0<wht,wht<len(c))]; c[wht]=0
wht = who-2; wht = wht[np.logical_and(0<wht,wht<len(c))]; c[wht]=0

不幸的是,上述情况相当缓慢。

是否有更快的方法来执行此操作或类似的操作?

1 个答案:

答案 0 :(得分:2)

对于通用窗口长度的邻居的一个可扩展解决方案是binary-dilate阈值比较的掩码,然后使用该掩码设置零 -

from scipy.ndimage.morphology import binary_dilation

W = 2 # window length of neighbors
thresh = 0.1
mask = c < thresh
kernel = np.ones(2*W+1)
mask_extended = binary_dilation(mask, kernel)
c[mask_extended] = 0