2016-06-11 33 views
3

我想從一維數組構建一個(n,n)數組,其中每行相對於前一個數據移動一個(包裝)一個。下面的代碼執行此操作:在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]] 

有沒有辦法做到這一點numpy的更快,即避免了for -loop,在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