gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:41:13 28 4
gpt4 key购买 nike

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

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

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

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

import numpy as np
arr = np.array([2., 5., 8., 9., 6.])
window_size = 3
for i in range(len(arr) - window_size + 1):
result.append(arr[i : i + window_size] / arr[i])

等等

当数组很大时会很慢,请问有没有更好的办法?我想没有办法解决 O(n^2) 的复杂性,但也许 numpy 有一些我不知道的优化。

最佳答案

这是使用 broadcasting 的矢量化方法-

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)

我们也可以使用NumPy strides为了更有效地提取滑动窗口,就像这样 -

n = a.strides[0]
a2D = np.lib.stride_tricks.as_strided(a,shape=(nrows,N),strides=(n,n))

sample 运行-

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 ]])

关于python - 如何对 numpy 数组进行采样并有效地对每个样本执行计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40169359/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com