首页 >后端开发 >Python教程 >如何在 NumPy 中使用 Strides 高效提取子数组?

如何在 NumPy 中使用 Strides 高效提取子数组?

Barbara Streisand
Barbara Streisand原创
2024-12-03 18:05:16271浏览

How to Efficiently Extract Subarrays with Strides in NumPy?

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn