Вы можете использовать либо логическое индексирование, либо ручную итерацию.Первый более эффективен для небольших массивов;последний для больших массивов с небольшим количеством значений вне области охвата с обеих сторон.
Логическое индексирование
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])