2016-06-11 46 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