如何对一个numpy数组进行采样并有效地对每个样本进行计算?

2024-03-28 21:25:44 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个1d数组,我想要的是用一个移动窗口进行采样,并在窗口内用第一个元素除以每个元素。在

例如,如果我有[2, 5, 8, 9, 6],窗口大小为3,则结果将是

[[1, 2.5, 4],
 [1, 1.6, 1.8],
 [1, 1.125, 0.75]].

我现在做的基本上是一个for循环

^{pr2}$

等等

当数组很大的时候,速度很慢,我想知道有没有更好的方法?我想没有办法绕过O(n^2)的复杂性,但也许numpy有一些我不知道的优化。在


Tags: 方法numpy元素for数组速度复杂性办法
1条回答
网友
1楼 · 发布于 2024-03-28 21:25:44

下面是一个使用^{}-

N = 3  # Window size
nrows = a.size-N+1
a2D = a[np.arange(nrows)[:,None] + np.arange(N)]
out = a2D/a[:nrows,None].astype(float)

我们还可以使用^{}来更有效地提取滑动窗口,如-

^{pr2}$

样本运行-

In [73]: a
Out[73]: array([4, 9, 3, 6, 5, 7, 2])

In [74]: N = 3
    ...: nrows = a.size-N+1
    ...: a2D = a[np.arange(nrows)[:,None] + np.arange(N)]
    ...: out = a2D/a[:nrows,None].astype(float)
    ...: 

In [75]: out
Out[75]: 
array([[ 1.        ,  2.25      ,  0.75      ],
       [ 1.        ,  0.33333333,  0.66666667],
       [ 1.        ,  2.        ,  1.66666667],
       [ 1.        ,  0.83333333,  1.16666667],
       [ 1.        ,  1.4       ,  0.4       ]])

相关问题 更多 >