2016-06-11 3 views
3

1 차원 배열에서 (n,n) - 배열을 생성하고 싶습니다. 각 행은 이전 행에 대해 상대적으로 하나씩 이동합니다. 결과Numpy에서 'rolling'행의 행렬을 효율적으로 작성하기

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

관련 문제