首页 >后端开发 >Python教程 >如何从 NumPy 数组中高效提取给定步长的子数组?

如何从 NumPy 数组中高效提取给定步长的子数组?

Patricia Arquette
Patricia Arquette原创
2024-12-09 21:18:10830浏览

How to Efficiently Extract Subarrays with a Given Stride from a NumPy Array?

以给定的步长/步长有效地从 Numpy 数组中获取子数组

在数据分析领域,我们经常需要提取具有特定步长的子数组较大数组的步幅或步长。 Numpy 是流行的 Python 数值运算库,它提供了多种方法来有效地实现此目的。

问题陈述:
给定一个 Numpy 数组,我们想要提取一个由以下子数组组成的矩阵具有特定步幅或步长的固定长度。步幅是连续子数组开头之间的距离。

讨论:

创建子数组的一种直接方法是使用 for 循环迭代原始数组。虽然这种方法有效,但对于大型数组来说可能会很慢。

方法 1:广播

NumPy 的广播机制允许我们创建没有循环的子数组。我们可以使用以下函数来获取数组、子数组长度 (L) 和步幅 (S):

def broadcasting_app(a, L, S):
    nrows = ((a.size - L) // S) + 1
    return a[S * np.arange(nrows)[:, None] + np.arange(L)]

解释:
np.arange(nrows) 创建步长为 1 的索引数组。通过将其与 S 相乘,我们得到每个子数组的起始索引。然后,我们将这些索引广播到 a 的行中以获得子数组。

方法 2:NumPy Strides

另一种有效的方法使用 NumPy 的 strides 功能。步幅表示沿每个轴的连续元素之间的字节数。我们可以使用这些信息来创建子数组:

def strided_app(a, L, 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))

解释:
我们使用 np.lib.stride_tricks.as_strided 通过利用 a 的步长来重塑 a 的形状。生成的数组具有所需的行数 (nrows) 和子数组长度 (L),同时保持 S 的步长。

示例代码:

来说明方法:

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

print(broadcasting_app(a, L=5, S=3))
print(strided_app(a, L=5, S=3))

输出:

[[ 1  2  3  4  5]
 [ 4  5  6  7  8]
 [ 7  8  9 10 11]]
[[ 1  2  3  4  5]
 [ 4  5  6  7  8]
 [ 7  8  9 10 11]]

两种方法都可以有效地生成具有所需步长的子数组矩阵。

以上是如何从 NumPy 数组中高效提取给定步长的子数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

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