Расширение шагов для нарезки пустых массивов - PullRequest
2 голосов
/ 10 апреля 2019

Мой вопрос похож на этот: субсэмплирование каждой n-й записи в массиве numpy

Допустим, у меня есть массив, как указано ниже: a = [1,2,2,2, 3,4,1,2,2,2,3,4,1,2,2,2,3,4 ....]

Как мне увеличить срез, чтобы я срезал триэлементы в определенные промежутки времени?Т.е. как я могу нарезать 2s из массива?Я считаю, что базовая нарезка не работает в этом случае.

Ответы [ 3 ]

3 голосов
/ 10 апреля 2019

Здесь кажется, что самое простое:

 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()
3 голосов
/ 10 апреля 2019

Вы можете сделать это с помощью индивидуальной индексации.

Мы хотим начать с элемента с индекса 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]
2 голосов
/ 10 апреля 2019

Вот векторизованный вариант с 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...