Маскировка только определенного диапазона показателей в NumPy - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть ndarray.Мне нужно замаскировать любое число меньше 50, пока первое найденное число не станет больше 50. Это должно быть сделано как в начале, так и в конце строки.Правильно, когда первое найденное число> 50, маскирование должно прекратиться.

Один ряд выглядит следующим образом:

    [ 0   1   1   0  57  121  120  157  77  14   0   3   0   0   0   0  67 100  
    98  97 101 129 139 105  97 105 181 126  10   0   0]

Я хочу что-то вроде:

    [-- -- -- -- 57 121 120 157 77 14  0  3  0  0  0  0 67 100 98 97
 101 129 139 105 97 97 105 181 126 -- -- --]

Маскировка должна прекратиться прямо перед 57 во второй строке и на 126 в4-я последняя строка.

Я пробовал ma.masked_where, но он также маскирует 0 между ними, чего я не хочу.

Итак, если есть способ сделать это, или вы можете мне помочь, чтобы я мог указать диапазон индексов, например: [0:40] только те, которые должны быть замаскированы.

Я не хочу менять размер массива после его маскировки.Кроме того, присутствие -- не повлияет на мою цель.

1 Ответ

0 голосов
/ 23 сентября 2018

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

Логическое индексирование

x = np.array([0, 0, 0, 2, 3, 51, 34, 1, 23, 32, 32, 52, 0, 0, 0])

start = (x > 50).argmax()
end = len(x) - (x[::-1] > 50).argmax()

print(x[start: end])

[51 34  1 23 32 32 52]

Ручная итерация

Использование next свыражение генератора и enumerate:

start = next(idx for idx, val in enumerate(x) if val > 50)
end = len(x) - next(idx for idx, val in enumerate(reversed(x)) if val > 50)

print(x[start: end])

[51 34  1 23 32 32 12]

Маскировка

Если вы хотите заменить значения вне области на np.nan, вы можете назначить их соответствующим образом, не обращая внимания на преобразование в float сначала, как NaN значения float:

x = x.astype(float)
x[:start] = np.nan
x[end:] = np.nan

print(x)

array([nan, nan, nan, nan, nan, 51., 34.,  1., 23., 32., 32., 52., nan, nan, nan])
...