我正在寻找一种方法来将长度为n的np.array
移位n-1次,并创建移位向量的矩阵。
例如,如果这是我的载体:
[1,4,7,8]
我想要得到的是:
[[None, None, None],
[1 , None, None],
[4 , 1 , None],
[7 , 4 , 1 ]]
我可以使用for
循环和shift
轻松地做到这一点,但是我想知道内置numpy
函数是否有更有效的方法。
答案 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:]