Индексирование с Маскированными массивами в numpy
у меня есть немного кода, который пытается найти содержимое массива по индексам, указанным другим, что может указывать индексы, которые находятся вне диапазона бывшего массива.
input = np.arange(0, 5)
indices = np.array([0, 1, 2, 99])
что я хочу сделать это: печать ввода [индексы] и получить [0 1 2]
но это дает исключение (как и ожидалось):
IndexError: index 99 out of bounds 0<=index<5
поэтому я подумал, что могу использовать маскированные массивы, чтобы скрыть индексы за пределами:
indices = np.ma.masked_greater_equal(indices, 5)
но еще:
>print input[indices]
IndexError: index 99 out of bounds 0<=index<5
хотя:
>np.max(indices)
2
поэтому мне сначала нужно заполнить маскированный массив, что раздражает, так как я не знаю, какое значение заполнения я мог бы использовать, чтобы не выбирать индексы для тех, которые находятся вне диапазона:
вход для печати[np.Ма.заполнено (индексы, 0)]
[0 1 2 0]
Итак, мой вопрос: как вы можете эффективно использовать numpy для безопасного выбора индексов из массива без превышения границ ввода массив?
2 ответов
без использования маскированных массивов вы можете удалить индексы, большие или равные 5, например:
print input[indices[indices<5]]
Edit: обратите внимание, что если вы также хотите отказаться от отрицательных индексов, вы можете написать:
print input[indices[(0 <= indices) & (indices < 5)]]
индексировать массивы в масках-очень плохая идея. Было (очень короткое) время с использованием MaskedArrays для индексирования, это вызвало бы исключение, но это было слишком жестко...
в вашем тесте, вы фильтрации indices
найти записи, соответствующие условию. Что делать с пропавшими записи вашего MaskedArray ? Является ли условие ложным ? Правда ? Следует ли использовать значение по умолчанию ? Это зависит от вас, пользователя, чтобы решить, что делать.
используя indices.filled(0)
означает, что, когда элемент indices
маскируется (как в, undefined), вы хотите взять первый индекс (0) по умолчанию. Возможно, не то, что ты хотел.
здесь, я бы просто использовать input[indices.compressed()]
: the compressed
метод сглаживает ваш MaskedArray, сохраняя только разоблаченные записи.
но, как вы поняли, вам, вероятно, не нужны MaskedArrays в первую очередь