我有一个包含一些“坏”值的一维NumPy数组。我要剔除他们。
每个坏值的邻居都只是“调皮的”,但我也想剔除它们。
一个可靠的坏值测试方法是询问:
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
不幸的是,上述过程相当缓慢。
是否有更快的方法来执行此操作或类似操作?
最佳答案
对于邻居的常规窗口长度,一种可伸缩的解决方案是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