У меня есть последовательность чисел, которые я хотел бы вставить в больший массив с нерегулярными интервалами:
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. шаблон всегда будет диапазоном, если это поможет.
Создайте двумерный массив селекторов, чтобы выбрать индексы dates
вы хотите изменить, с помощью numpy.add.outer
, а затем выполните широковещательное назначение pattern
для выбранных индексов:
dates[numpy.add.outer(starts, numpy.arange(len(pattern)))] = pattern
Мы можем использовать np.lib.stride_tricks.as_strided
основе scikit-image view_as_windows
чтобы получить скользящие оконные представления в выходном массиве и, следовательно, назначить в него новые значения. Это было бы довольно эффективно, так как мы работаем с представлениями, там нет генерации явных индексов, и назначение является векторизованным и транслируемым.
Реализация будет выглядеть примерно так -
from skimage.util.shape import view_as_windows
view_as_windows(dates,pattern.size)[starts] = pattern
Больше информации об использовании as_strided
основе view_as_windows
.