在 Numpy 数组中使用跨步提取子数组
考虑一个 Python Numpy 数组 a:
a = numpy.array([1,2,3,4,5,6,7,8,9,10,11])
我们的目标提取长度为 5、步长为 3 的子数组。这会产生一个矩阵以下内容:
numpy.array([[1,2,3,4,5],[4,5,6,7,8],[7,8,9,10,11]])
更简洁的实现
虽然 for 循环方法是可行的,但 Numpy 提供了更高效的方法:
方法 1:广播
这种方法利用了广播:
def broadcasting_app(a, L, S ): # Window len = L, Stride len/stepsize = S nrows = ((a.size-L)//S)+1 return a[S*np.arange(nrows)[:,None] + np.arange(L)]
方法 2:步幅优化
此方法利用了 Numpy 的高效步幅:
def strided_app(a, L, S ): # Window len = L, Stride len/stepsize = S nrows = ((a.size-L)//S)+1 n = a.strides[0] return np.lib.stride_tricks.as_strided(a, shape=(nrows,L), strides=(S*n,n))
用法示例:
a = numpy.array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) broadcasting_app(a, L = 5, S = 3) # [[ 1 2 3 4 5] # [ 4 5 6 7 8] # [ 7 8 9 10 11]] strided_app(a, L = 5, S = 3) # [[ 1 2 3 4 5] # [ 4 5 6 7 8] # [ 7 8 9 10 11]]
这些方法为在 Numpy 数组中提取跨步子数组提供了更高效、更优化的解决方案。
以上是如何在 NumPy 中使用 Strides 高效提取子数组?的详细内容。更多信息请关注PHP中文网其他相关文章!