Python 从三维数据元素中删除异常值
我编写了一个从数据集中删除异常值的函数。例如,它使用z分数工作,也适用于1d元素Python 从三维数据元素中删除异常值,python,numpy,Python,Numpy,我编写了一个从数据集中删除异常值的函数。例如,它使用z分数工作,也适用于1d元素 # usage remove_outliers(data) [10 99 12 15 9 2 17 15]---->[10 12 15 9 17 15] # usage remove_outliers(data, thresh=(30,30,30), axis=(0,1)) [(0, 10, 3) (99, 255, 255) (100, 10, 9) (45, 34, 9)]---->[
# usage remove_outliers(data)
[10 99 12 15 9 2 17 15]---->[10 12 15 9 17 15]
# usage remove_outliers(data, thresh=(30,30,30), axis=(0,1))
[(0, 10, 3) (99, 255, 255) (100, 10, 9) (45, 34, 9)]---->[ 0 10 3 99 255 255 100 10 9 45 34 9]
然而,它是错误的三维数据,它拉离我的三维数据,例如
# usage remove_outliers(data)
[10 99 12 15 9 2 17 15]---->[10 12 15 9 17 15]
# usage remove_outliers(data, thresh=(30,30,30), axis=(0,1))
[(0, 10, 3) (99, 255, 255) (100, 10, 9) (45, 34, 9)]---->[ 0 10 3 99 255 255 100 10 9 45 34 9]
我期待着这样的结果
[(0, 10, 3) (100, 10, 9) (45, 34, 9)]
我的函数remove_outliers()
有什么错误?我如何编辑它来处理三维元素数据
def remove_outliers(data, thresh=2.0, axis=None):
# If a value is > thresh std_deviations from the mean they are an outlier and remove it
# Eg, thresh = 3, std_dev = 2, mean=18. If value=7, then 7 is an outlier
d = np.abs(data - np.median(data, axis))
mdev = np.median(d, axis)
s = d/mdev if mdev else 0.0
return data[s<thresh]
def删除异常值(数据,阈值=2.0,轴=无):
#如果某个值大于平均值的标准偏差阈值,则该值为异常值,并将其删除
#例如,阈值=3,标准偏差=2,平均值=18。如果值=7,则7为异常值
d=np.abs(数据-np.median(数据,轴))
mdev=np.中值(d轴)
如果mdev为0.0,则s=d/mdev
返回数据[s您需要组合每个点的坐标条件。在下面的代码中,这是由完成的。所有(轴=1)
#numpy.median相当慢,让我们构建自己的
def中值(x):
m、 n=x.形状
中间=np.arange((m-1)>>1,(m>>1)+1)
x=np.分区(x,中间,轴=0)
返回x[中间].平均值(轴=0)
#主要功能
def删除_异常值(数据,阈值=2.0):
m=中值(数据)
s=np.abs(数据-m)
返回数据[(感谢您的回答,我的数据可以是1d或2d,但您的示例只处理2d数据?作为一种快速解决方法,您可以使用np.c_[input_array]
。如果是2d,则保持input_array
不变,如果是1d,则在形状上附加1。