Назначить последовательность с нерегулярными интервалами в одномерном массиве - Python / NumPy - PullRequest
1 голос
/ 16 апреля 2019

У меня есть последовательность чисел, которую я хотел бы вставить в больший массив с нерегулярными интервалами:

dates = np.zeros(15)
pattern = np.arange(3) + 1
starts = [2, 6, 11]
for start in starts:
    dates[start:start + pattern.size] = pattern

> [0 0 1 2 3 0 1 2 3 0 0 1 2 3 0]

Я должен сделать это много раз (100M +) для больших (10K +) массивов, поэтомуЯ ищу способ сделать это с помощью трансляции или другого эффективного метода, избегая цикла for. шаблон всегда будет диапазоном, если это поможет.

Ответы [ 2 ]

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

Мы можем использовать np.lib.stride_tricks.as_strided на основе scikit-image's view_as_windows, чтобы получить скользящие оконные представления в выходном массиве и, следовательно, присвоить ему новые значения.Это было бы довольно эффективно, так как мы работаем с представлениями, здесь нет явных индексов, а присвоение является векторизованным и транслируемым.

Реализация будет выглядеть примерно так -

from skimage.util.shape import view_as_windows

view_as_windows(dates,pattern.size)[starts] = pattern

Дополнительная информация по использованию as_strided на основе view_as_windows.

2 голосов
/ 16 апреля 2019

Создайте двумерный массив селекторов, чтобы выбрать индексы dates, которые вы хотите изменить с помощью numpy.add.outer, затем выполните широковещательное присвоение pattern выбранным индексам:

dates[numpy.add.outer(starts, numpy.arange(len(pattern)))] = pattern
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...