Имеется массив a из N элементов:
a = np.arange(4)
a
array([0, 1, 2, 3])
Необходимо получить массив N на N из последовательно сдвинутых копий исходного массива, т.е.
array([[0, 1, 2, 3],
[3, 0, 1, 2],
[2, 3, 0, 1],
[1, 2, 3, 0]])
Пока ничего кроме очевидного:
np.array([np.roll(a, i) for i in range(len(a))])
придумать не удалось. На моей машине производительность такого решения для массива из 1024 элементов - 10 мс.
python -m timeit -s 'import numpy as np; a = np.arange(1024)' 'np.array([np.roll(a, i) for i in range(len(a))])'
100 loops, best of 3: 10.5 msec per loop
Вопрос - можно ли быстрее?