如何使用Numpy原生方法实现数组滑动窗口生成,提升大数组处理效率?
解决方案
你可以直接使用numpy.lib.stride_tricks.sliding_window_view接口实现无拷贝的滑动窗口生成,该接口在numpy 1.20.0及以上版本可用,处理数百万条数据时性能远高于Python循环,因为它只创建原数组的视图、不会额外复制数据。
示例代码如下:
import numpy as np # 原数组 arr = np.array([ [1, 0, 1], [0, 0, 2], [1, 2, 0], [0, 1, 3], [2, 2, 1], [2, 0, 2] ]) n = 4 # 沿第0维生成大小为n的滑动窗口 new_arr = np.lib.stride_tricks.sliding_window_view(arr, window_shape=n, axis=0) # 调整维度顺序到你需要的 (窗口数, 窗口大小, 特征数) new_arr = new_arr.transpose(0, 2, 1) # 验证结果 print(new_arr)
运行后输出和你给出的预期结果完全一致。
如果你的numpy版本低于1.20.0,也可以用更底层的as_strided接口实现:
def sliding_window(arr, n): stride0, stride1 = arr.strides # 计算输出形状 output_shape = (arr.shape[0] - n + 1, n, arr.shape[1]) # 计算新数组的步长 strides = (stride0, stride0, stride1) return np.lib.stride_tricks.as_strided(arr, shape=output_shape, strides=strides) new_arr = sliding_window(arr, n)
注意:上述两种方法生成的都是原数组的视图,修改
new_arr的值会同步修改原数组,如果需要独立的副本可以最后调用.copy()方法。
内容的提问来源于stack exchange,提问作者Jivan
相关产品推荐
相关产品推荐

