Построение матрицы «свернутых» строк эффективно в Numpy

Я хотел бы построить (n,n) -матрица из одномерного массива, где каждая строка сдвигается (с оберткой) на одну по отношению к предыдущей. Следующий код делает следующее:

 import numpy as np r = np.array([1, 2, 3, 4, 5]) n = len(r) MM = np.zeros((n, n), dtype=r.dtype) for k in range(n): MM[k, :] = np.roll(r, k) print(MM) 

что приводит к:

 [[1 2 3 4 5] [5 1 2 3 4] [4 5 1 2 3] [3 4 5 1 2] [2 3 4 5 1]] 

Есть ли способ сделать это Numpy быстрее, т. Е. Избегать for -loop, для больших r в Numpy?

Взгляните на scipy.linalg.circulant

 In [255]: r Out[255]: array([1, 2, 3, 4, 5]) In [256]: circulant(r).T Out[256]: array([[1, 2, 3, 4, 5], [5, 1, 2, 3, 4], [4, 5, 1, 2, 3], [3, 4, 5, 1, 2], [2, 3, 4, 5, 1]]) 

или scipy.linalg.toeplitz

 In [257]: toeplitz(np.roll(r[::-1], 1), r) Out[257]: array([[1, 2, 3, 4, 5], [5, 1, 2, 3, 4], [4, 5, 1, 2, 3], [3, 4, 5, 1, 2], [2, 3, 4, 5, 1]])