У меня есть 2 массива NumPy следующим образом:
import numpy as np
a = np.array([1, 4, 2, 6, 4, 4, 6, 2, 7, 6, 2, 8, 9, 3, 6, 3, 4, 4, 5, 8])
b = np.array([2, 8, 3, 9, 9, 9, 7, 5, 4, 8, 6, 5, 4, 4, 7, 2, 1, 1, 9, 9])
и 2 постоянных числа:
c = 6
d = 3
На основе предыдущего вопроса , я могу извлечьмассив, каждый раз элементы в a
меньше чем c
, 2 или более раз подряд:
array = np.append(a, -np.inf) # padding so we don't lose last element
mask = array >= c # values to be removed
split_indices = np.where(mask)[0]
for subarray in np.split(array, split_indices + 1):
if len(subarray) > 2:
print(subarray[:-1])
, которые выводят:
[1. 4. 2.]
[4. 4.]
[3. 4. 4. 5.]
Теперь я хотел бы изменитьмое условие для множественного условия, где 2 или более раз подряд:
- элементов в
a
меньше c
,
И
элементов в
b
меньше
d
Используя следующий код:
mask = ((a< c) & (b< d))
Я знаю, что мои условия (2 раза или более последовательно)просто встречайте 1 раз по индексам 15
, 16
и 17
.
Теперь я хотел бы извлечь значение a
, соответствующее тем индексам, где мои условия выполняются.
Основываясь на ответе по ссылке, я попытался:
a1= np.append(a, -np.inf)
a2=np.append(b, -np.inf) # padding so we don't lose last element
mask = ((a1< c) & (a2< d)) # values to be removed
split_indices = np.where(mask)[0]
for subarray in np.split(a, split_indices + 1):
if len(subarray) > 2:
print(subarray[:-1])
Что удивительно, вернуть массив, где мои условия не соответствуют ...
[4 2 6 4 4 6 2 7 6 2 8 9 3 6]
Я также попробовал np.extract
следующим образом:
np.extract((len(list(g))>=2 for i, g in ((a < c) & (b < d)) if i), a)
, которые возвращают мне значение 1
, а не значение массива a
...
Требуемый выходной массив должен быть одним изindice 15
, 16
, 17
, соответствующее значению [3 4 4]
в массиве a
.
Может ли кто-нибудь указать мне инструменты Python, которые я мог бы использовать для извлечения массива, выполняющего моинесколько условий?
ПРИМЕЧАНИЕ: это минимальный пример моей проблемы, в моей "реальной жизни" мне нужно найти массивs, которые соответствуют моим условиям 14 или более раз подряд!