Вот один с 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:]