use*_*455 4 python performance numpy vectorization pandas
假设我有一个1d数组,我想要的是用移动窗口进行采样,并在窗口内将每个元素除以第一个元素.
例如,如果我有[2, 5, 8, 9, 6]一个窗口大小为3,结果将是
[[1, 2.5, 4],
[1, 1.6, 1.8],
[1, 1.125, 0.75]].
Run Code Online (Sandbox Code Playgroud)
我现在正在做的基本上是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])
Run Code Online (Sandbox Code Playgroud)
等等
当阵列很大时它很慢,我想知道是否有更好的方法?我想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)
Run Code Online (Sandbox Code Playgroud)
我们还可以NumPy strides用来更有效地提取滑动窗口,就像这样 -
n = a.strides[0]
a2D = np.lib.stride_tricks.as_strided(a,shape=(nrows,N),strides=(n,n))
Run Code Online (Sandbox Code Playgroud)
样品运行 -
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 ]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |