Как заставить np.ma.argmin возвращать None, если каждый элемент маскируется? - PullRequest
0 голосов
/ 19 марта 2020

Мотивация: в списке числовых c значений я пытаюсь найти индекс наименьшего значения - с условием стороны, что значение должно быть ниже определенного порога. Вот пример, где все работает как положено

import numpy as np
a = np.array([1, 5, -4])
threshold = 3
b = np.ma.MaskedArray(a, a >= threshold)
np.ma.argmin(b)  # returns 2, since a[2] is -4 which is the smallest element < 3

Вот случай, когда np.ma.argmin делает что-то неожиданное:

a = np.array([4, 5])
threshold = 3
b = np.ma.MaskedArray(a, a >= threshold)
np.ma.argmin(b)  # returns 0, expected a None etc. since there is no element < 3

Почему это так и как я могу заставить его вернуться None? Примечание: настройка fill_value = None не помогла.

1 Ответ

0 голосов
/ 19 марта 2020

Код для argmin:

def argmin(self, axis=None, fill_value=None, out=None):
    if fill_value is None:
        fill_value = minimum_fill_value(self)
    d = self.filled(fill_value).view(ndarray)
    return d.argmin(axis, out=out)

Заполняет его соответствующим значением заполнения (для int dtype это наибольшее целое число), а затем выполняет обычный массив argmin. Если все значения замаскированы, то все это максимальные значения, а первое - argmin.

b.min() возвращает специальное значение ma ma.MaskedConstant. Поэтому вам, возможно, придется обернуть ваш argmin вызов каким-то тестом для этого значения. Я не вижу, что функция np.ma.is... проверяет это. Но в документах что-то есть.

...