У меня есть вектор целых чисел (массив 1D numpy), который выглядит следующим образом:
8, 1, 1, 2, 8, 99, 1, 2, 1, 2, 8, 2, 2, 2, 8, 99, 99, 8, 1, 1
(В векторизации) я хочу отфильтровать все данные между 8, которые содержат хотя бы одно значение 99
Таким образом, в этом примере данные, которые я хочу вырезать, выделены жирным шрифтом:
8, 1, 1, 2, <b>8, 99, 1, 2, 1, 2</b>, 8, 2, 2, 2, <b>8, 99, 99</b>, 8, 1, 1
(т. Е. Это данные, которые находятся между 8 и содержат как минимум один 99)
Так что, если бы я создал логическую маску для обрезки этих данных, она бы выглядела так:
Data: 8, 1, 1, 2, <b>8, 99, 1, 2, 1, 2</b>, 8, 2, 2, 2, <b>8, 99, 99</b>, 8, 1, 1
Mask: T, T, T, T, <b>F, F, F, F, F, F</b>, T, T, T, T, <b>F, F, F</b>, T, T, T
А данные после обрезки выглядят так:
Data(Mask) = 8, 1, 1, 2, 8, 2, 2, 2, 8, 1, 1
Я могу получить с векторизованным кодом, который может сделать это, если есть гарантированный равный интервал между 8. Вот этот код:
inputRaw = np.array([8, 2, 3, 2, 99, 2, 8, 2, 3, 2, 2, 2, 8, 2, 3, 3, 3, 3])
inputPartitioned = np.reshape(inputRaw, (3, 6))
# reshaping it into an array of the form: np.array([[8, 2, 3, 2, 99, 2], [8, 2, 3, 2, 2, 2], [8, 2, 3, 3, 3, 3]])
selectedSections = np.logical_not(np.any(inputPartitioned>8, axis=1))
outputPartitioned = inputPartitioned[selectedSections]
outputFlattened = outputPartitioned.flatten()
Еще одна вещь, которая мне нужна, - это маска или индекс, который сообщает мне (в исходных индексах) данные, которые были обрезаны. (Мне это нужно, потому что у меня есть второй массив, который я хочу отслеживать, у которого есть общие индексы с первым массивом). Я могу закодировать эту маску (предполагая равный интервал между 8-ми) следующим образом:
inputIndex = np.arange(inputRaw.size)
inputIndexPartitioned = np.reshape(inputIndex, (3, 6))
outputPartitionedIndex = inputIndexPartitioned[selectedSections]
outputFlattenedIndex = outputPartitionedIndex.flatten()
Но я не уверен, как сделать это векторизованным способом в случае неравного расстояния между 8-ми.
Есть идеи? Эти массивы очень длинные, поэтому полезны решения, которые быстро работают для больших массивов. Кроме того, я вполне уверен, что эти «99» будут всегда сразу после 8, так что, возможно, это может быть полезной информацией при создании алгоритма.