Индексирование с массивами в масках в NumPy - PullRequest
6 голосов
/ 04 октября 2010

У меня есть немного кода, который пытается найти содержимое массива по индексам, указанным другим, которые могут указывать индексы, выходящие за пределы диапазона предыдущего массива.

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.ma.filled (индексы, 0)]

[0 1 2 0]

Итак, мой вопрос: как эффективно использовать numpy для безопасного выбора индексов из массива, не выходя за границы входного массива?

Ответы [ 2 ]

5 голосов
/ 04 октября 2010

Не используя маскированные массивы, вы можете удалить индексы, большие или равные 5, например:

print input[indices[indices<5]]

Редактировать: обратите внимание, что если вы также хотите отбросить отрицательные индексы, вы можете написать:

print input[indices[(0 <= indices) & (indices < 5)]]
4 голосов
/ 17 августа 2012

Это ОЧЕНЬ ПЛОХАЯ идея индексировать с замаскированными массивами.Было (очень короткое) время с использованием MaskedArrays для индексации, что вызвало бы исключение, но оно было слишком резким ...

В вашем тесте вы фильтруете indices, чтобы найти записисоответствие условию.Что вы должны сделать с отсутствующими записями вашего MaskedArray?Является ли условие ложным?Правда ?Вы должны использовать по умолчанию?Пользователь сам должен решить, что делать.

Использование indices.filled(0) означает, что когда маскируется элемент indices (как, например, неопределенный), вы хотите взять первый индекс (0) по умолчанию.Возможно, не то, что вы хотели.

Здесь я бы просто использовал input[indices.compressed()]: метод compressed выравнивает ваш MaskedArray, сохраняя только немаскированные записи.

Но, как вы поняли, вывероятно, в первую очередь не нужны MaskedArrays

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...