从3D数据元素中删除异常值

时间:2019-09-22 02:48:27

标签: python numpy

我编写了一个从数据集中删除异常值的函数。例如,它使用z得分有效,并且适用于1d元素;

$oht[$key.Trim()] = 
  if ($key.Trim() -eq 'mac_address') { $val.Trim() -split ', ' } else { $val.Trim() }

但是对于3d数据来说是错误的,例如,它将我的3d数据拆开;

# 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)] 中我在做什么错,如何编辑它以处理3d元素数据?

remove_outliers()

1 个答案:

答案 0 :(得分:1)

您需要组合每个点的坐标条件。在下面的代码中,此操作由.all(axis=1)

完成
# numpy.median is rather slow, let's build our own instead
def median(x):
    m,n = x.shape
    middle = np.arange((m-1)>>1,(m>>1)+1)
    x = np.partition(x,middle,axis=0)
    return x[middle].mean(axis=0)

# main function
def remove_outliers(data,thresh=2.0):           
    m = median(data)                            
    s = np.abs(data-m)                          
    return data[(s<median(s)*thresh).all(axis=1)]

# small test
remove_outliers(np.array([(0, 10, 3), (99, 255, 255), (100, 10, 9), (45, 34, 9)]))
# array([[100,  10,   9],
#        [ 45,  34,   9]])