NAN в scipy.ndimage.filters.maximum_filter - PullRequest
       31

NAN в scipy.ndimage.filters.maximum_filter

0 голосов
/ 22 октября 2018

Я не совсем понимаю, как обрабатывать NAN в функции Maximum_filter.Я ожидал, что либо NAN будут проигнорированы, либо лучше, если где-нибудь в ядре появится nan, и в результате получится NAN.Вместо этого к NAN, похоже, относятся по-разному в зависимости от места появления

Проблема, похоже, немного похожа на Scipy Maximum_filter сумасшедший

Вот пример кода, сделанного с версией Scipy 0.19.1:

    import numpy as np
    import scipy.ndimage.filters

    a = np.array([[    0,     0.,   1.,   2.,   3.,   4.],
                  [    0., np.nan,   1.,   2.,   3.,   2.],
                  [    0.,     0.,   1.,   2.,   3.,   4.],
                  [    1.,     0.,   1.,   2.,   3.,   4.]])

    b = np.array([[np.nan,     0.,   1.,   2.,   3.,   4.],
                  [    0.,     0,   1.,   2.,   3.,   2.],
                  [    0.,     0.,   1.,   2.,   3.,   4.],
                  [    1.,     0.,   1.,   2.,   3.,   4.]])

    c = np.array([[np.nan,     0.,   1.,   2.,   3.,   4.],
                  [    0., np.nan,   1.,   2.,   3.,   2.],
                  [    0.,     0.,   1.,   2.,   3.,   4.],
                  [    1.,     0.,   1.,   2.,   3.,   4.]])


    print(scipy.ndimage.filters.maximum_filter(a, size=3))
    print(scipy.ndimage.filters.maximum_filter(b, size=3))
    print(scipy.ndimage.filters.maximum_filter(c, size=3))

Предоставление вывода

    [[ 0.  1.  2.  3.  4.  4.]
     [ 0.  1.  2.  3.  4.  4.]
     [ 1.  1.  2.  3.  4.  4.]
     [ 1.  1.  2.  3.  4.  4.]]
    [[ nan  nan   2.   3.   4.   4.]
     [ nan  nan   2.   3.   4.   4.]
     [  1.   1.   2.   3.   4.   4.]
     [  1.   1.   2.   3.   4.   4.]]
    [[ nan  nan   2.   3.   4.   4.]
     [ nan  nan   2.   3.   4.   4.]
     [  1.   1.   2.   3.   4.   4.]
     [  1.   1.   2.   3.   4.   4.]]

В «a» NAN игнорируется, в «b» кажется, что каждое сравнение с NAN приводит к NAN, а «c» дает точно такой же результат, как «b».".

Вопросы:
1. Это ошибка или поведение может быть как-то оправдано?
2. Как я могу получить результат" b "для NAN не в верхнем левом углу?

1 Ответ

0 голосов
/ 22 октября 2018

Старайтесь избегать nan с функциями, которые явно не заявляют, что они имеют специальную nan обработку.Это не число, поэтому не используйте его там, где ожидается число!

SciPys maximum_filter является одним из них.

Я думал о том, чтобы углубиться во внутреннюю среду SciPy, но, поскольку это детали реализации, которые могут измениться без уведомления или устаревания, вероятно, оно того не стоит.Также это будет очень запутанно, поскольку это зависит от порядка сравнений и самого сравнения, а также от того, как функция выполняет maximum_filter (я подозреваю, что они используют динамический максимальный фильтр на основе кучи).

ОднакоКонечно, вы можете получить желаемый результат.Если вы хотите, чтобы NaN s игнорировались, вы можете заменить их (для maximum_filter) на -np.inf, и если вы хотите, чтобы они были "распространены", то вы можете использовать, например, универсальный фильтр:

def maximum_filter_ignore_nan(array, *args, **kwargs):
    nans = np.isnan(array)
    replaced = np.where(nans, -np.inf, array)
    return scipy.ndimage.filters.maximum_filter(replaced, *args, **kwargs)


def maximum_filter_propagate_nan(array, *args, **kwargs):
    def inner(array):
        if np.isnan(array).any():
            return np.nan
        return array.max()
    return scipy.ndimage.generic_filter(arr, inner, size=3)

print(maximum_filter_ignore_nan(a, size=3))
print(maximum_filter_ignore_nan(b, size=3))
print(maximum_filter_ignore_nan(c, size=3))

print(maximum_filter_propagate_nan(a, size=3))
print(maximum_filter_propagate_nan(b, size=3))
print(maximum_filter_propagate_nan(c, size=3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...