Python 从三维数据元素中删除异常值

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)]---->[

我编写了一个从数据集中删除异常值的函数。例如,它使用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)]---->[  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。