Мой вопрос похож на этот: подвыборка каждой n-й записи в массиве numpy
Скажем, у меня есть массив, как показано ниже: а = [1,2,2,2,3,4,1,2,2,2,3,4,1,2,2,2,3,4....]
Как я могу расширить срез так, чтобы я нарезал три элемента через определенные промежутки времени? т.е. как я могу нарезать 2s из массива? Я считаю, что базовая нарезка не работает в этом случае.
Вы можете сделать это с помощью индивидуальной индексации.
Мы хотим начать с элемента с индексом 1, взять 3 элемента и затем пропустить 3 элемента:
a = np.array([1, 2, 2, 2, 3, 4, 1, 2, 2, 2, 3, 4, 1, 2, 2, 2, 3, 4])
start = 1
take = 3
skip = 3
indices = np.concatenate([np.arange(i, i + take) for i in range(start, len(a), take + skip)])
print(indices)
print(a[indices])
Выход:
[ 1 2 3 7 8 9 13 14 15]
[2 2 2 2 2 2 2 2 2]
Самое простое здесь кажется:
a = np.array([1,2,2,2,3,4,1,2,2,2,3,4,1,2,2,2,3,4])
a.reshape(-1,6)[1:4].ravel()
или если a
плохо разделяется:
period = 6
a.resize(np.math.ceil(a.size/period),period)
a[:,1:4].ravel()
Вот векторный вариант с masking
-
def take_sliced_regions(a, start, take, skip):
r = np.arange(len(a))-start
return a[r%(take+skip)<take]
Пробный запуск -
In [90]: a = np.array([1,2,2,2,3,4,1,2,2,2,3,4,1,2,2,2,3,4,1,2])
In [91]: take_sliced_regions(a, start=1, take=3, skip=3)
Out[91]: array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2])