你可以使用stride.as_strided:
import numpy.lib.stride_tricks as stride
s = u.strides[0]
H2 = stride.as_strided(u, shape=(N-q+1,q), strides=(s, s)).astype(complex)
使用strides=(s, s) 是关键——特别是,迈出第一步s 意味着H2 的每一行将索引前进到u,前进一个项目所需的字节数。因此,行重复,尽管移动了一个。
例如,
import numpy as np
import numpy.lib.stride_tricks as stride
N, q = 10**2, 6
u = np.arange((N-q+1)*(N))
def using_loop(u):
H = np.zeros(shape=(N-q+1,q),dtype=complex)
for i in range(0,N-q+1):
H[i,:] = u[i:q+i]
return H
def using_stride(u):
s = u.strides[0]
H2 = stride.as_strided(u, shape=(N-q+1,q), strides=(s, s)).astype(complex)
return H2
H = using_loop(u)
H2 = using_stride(u)
assert np.allclose(H, H2)
由于stride.as_strided 避免了Python for-loop,using_stride 比using_loop 快。优势随着N-q(迭代次数)的增加而增加。
当 N = 10**2 using_stride 时快 5 倍:
In [119]: %timeit using_loop(u)
10000 loops, best of 3: 61.6 µs per loop
In [120]: %timeit using_stride(u)
100000 loops, best of 3: 11.9 µs per loop
当 N = 10**3 using_stride 时快 28 倍:
In [122]: %timeit using_loop(u)
1000 loops, best of 3: 636 µs per loop
In [123]: %timeit using_stride(u)
10000 loops, best of 3: 22.4 µs per loop