繁体   English   中英

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

[英]shift numpy vector n times and create a matrix

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

例如,如果这是我的向量:

[1,4,7,8]

我想得到的是:

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

我可以使用for循环和shift轻松完成,但我想知道是否有更有效的内置numpy函数的方法。

这是一个带有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:]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM