2016-06-11 16 views
3

1次元配列から(n,n) -arrayを構築したいと思います。ここで、各行は前の配列に対して相対的に1つだけシフトしています。その結果Numpyでローリング行列を効率的に構築する

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]] 

はすなわち、for -loopを避け、より速くこのnumpyのを行う方法がnumpyの中に大きなrのために、あります次のコードは、このしていますか?

答えて

4

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]]) 
+0

感謝を見て、これは私が望んでいた答えでした。 – Dietrich

関連する問題