Я работаю с большими наборами данных. Я пытаюсь использовать библиотеку NumPy, где я могу, или функции python для эффективной обработки наборов данных (например, LC).
Сначала нахожу соответствующие индексы:
dt_temp_idx = np.where(dt_diff > dt_temp_th)
Затем я хочу создать маску, содержащую для каждого индекса последовательность, начиная от индекса до конечного значения, я попробовал:
mask_dt_temp = [np.arange(idx, idx+dt_temp_step) for idx in dt_temp_idx]
и:
mask_dt_temp = [idxs for idx in dt_temp_idx for idxs in np.arange(idx, idx+dt_temp_step)]
но это дает мне исключение:
The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Пример ввода:
indexes = [0, 100, 1000]
Пример вывода со стоповыми значениями после 10 целых чисел из каждого индекса:
list = [0, 1, ..., 10, 100, 101, ..., 110, 1000, 1001, ..., 1010]
1) Как я могу это решить? 2) Это лучшая практика?
Использование масок (логических массивов) эффективно, так как эффективно с точки зрения памяти и производительности. Мы будем использовать SciPy's binary-dilation
для расширения пороговой маски.
Вот пошаговая настройка и запуск решения:
In [42]: # Random data setup
...: np.random.seed(0)
...: dt_diff = np.random.rand(20)
...: dt_temp_th = 0.9
In [43]: # Get mask of threshold crossings
...: mask = dt_diff > dt_temp_th
In [44]: mask
Out[44]:
array([False, False, False, False, False, False, False, False, True,
False, False, False, False, True, False, False, False, False,
False, False])
In [45]: W = 3 # window size for extension (edit it according to your use-case)
In [46]: from scipy.ndimage.morphology import binary_dilation
In [47]: extm = binary_dilation(mask, np.ones(W, dtype=bool), origin=-(W//2))
In [48]: mask
Out[48]:
array([False, False, False, False, False, False, False, False, True,
False, False, False, False, True, False, False, False, False,
False, False])
In [49]: extm
Out[49]:
array([False, False, False, False, False, False, False, False, True,
True, True, False, False, True, True, True, False, False,
False, False])
Сравните mask
с, extm
чтобы увидеть, как происходит расширение.
Как мы видим, пороговое значение mask
расширяется на размер окна W
с правой стороны, как и ожидаемая маска вывода extm
. Это можно использовать для маскировки dt_diff[~extm]
элементов во входном массиве: для имитации удаления / отбрасывания элементов из следующих входных данных boolean-indexing
или, наоборот, dt_diff[extm]
для имитации их выбора.
Альтернатива # 1
extm = np.convolve(mask, np.ones(W, dtype=int))[:len(dt_diff)]>0
Альтернатива # 2
idx = np.flatnonzero(mask)
ext_idx = (idx[:,None]+ np.arange(W)).ravel()
ext_mask = np.ones(len(dt_diff), dtype=bool)
ext_mask[ext_idx[ext_idx<len(dt_diff)]] = False
# Get filtered o/p
out = dt_diff[ext_mask]
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения