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

1

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

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. шаблон всегда будет диапазоном, если это поможет.

Теги:
numpy
numpy-broadcasting

2 ответа

2
Лучший ответ

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

dates[numpy.add.outer(starts, numpy.arange(len(pattern)))] = pattern
1

Мы можем использовать 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.

  • 1
    Ах, конечно. Вы не можете создать вид только тех окон, которые вам нужны, но вы можете создать вид всех окон, а затем назначить их конкретным окнам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню