将numpy向量移位n次并创建一个矩阵

时间:2018-11-07 14:34:12

标签: python arrays numpy

我正在寻找一种方法来将长度为n的np.array移位n-1次,并创建移位向量的矩阵。

例如,如果这是我的载体:

[1,4,7,8]

我想要得到的是:

[[None, None, None],
 [1   , None, None],
 [4   , 1   , None],
 [7   , 4   , 1   ]]

我可以使用for循环和shift轻松地做到这一点,但是我想知道内置numpy函数是否有更有效的方法。

1 个答案:

答案 0 :(得分:1)

这里是np.lib.stride_tricks.as_strided-

def shifted_subarrays(a, fill=None):
    a = np.asarray(a)
    fillar = np.full(len(a)-1, fill)
    a_ext = np.concatenate((fillar,a))
    n = len(a)
    s = a_ext.strides[0]
    strided = np.lib.stride_tricks.as_strided
    return strided(a_ext[len(a)-2:], shape=(n,n-1), strides=(s,-s))

样品运行-

In [20]: a = [1,4,7,8]

In [21]: shifted_subarrays(a)
Out[21]: 
array([[None, None, None],
       [1, None, None],
       [4, 1, None],
       [7, 4, 1]], dtype=object)

In [46]: shifted_subarrays(a, fill=np.nan)
Out[46]: 
array([[nan, nan, nan],
       [ 1., nan, nan],
       [ 4.,  1., nan],
       [ 7.,  4.,  1.]])

一个简单的toeplitz-

from scipy.linalg import toeplitz
out = toeplitz(a,[None]*(len(a)))[:,1:]