Удалить выбросы из 3d элементов данных - PullRequest
0 голосов
/ 22 сентября 2019

Я написал функцию, которая удаляет выбросы из набора данных.Он работает с использованием 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]

Я ожидаю, что результат будет примерно таким:

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

1 Ответ

1 голос
/ 22 сентября 2019

Вам необходимо объединить координаты для каждой точки.В приведенном ниже коде это делается .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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...