python - 如何为 numpy 数组制作非方形滚动窗口?
问题描述
如何将滚动窗口函数大小更改为 2x3 窗口,而不是现在的 3x3 窗口?我不够熟练,也不知道如何对函数进行逆向工程以了解 window_size 的工作原理:(
import numpy as np
def rolling_window(array, window_size):
itemsize = array.itemsize
shape = (array.shape[0] - window_size + 1,
array.shape[1] - window_size + 1,
window_size, window_size)
strides = (array.shape[1] * itemsize, itemsize,
array.shape[1] * itemsize, itemsize)
return np.lib.stride_tricks.as_strided(array, shape=shape, strides=strides)
roller = np.arange(1,16).reshape(3,5)
print(roller)
run = rolling_window(roller,3)
print(run)
解决方案
如果您知道您想要一个 2D 窗口,则在定义时指定window_size[0]
使用array.shape[0]
和window_size[1]
使用:array.shape[1]
shape
def rolling_window(array, window_size):
itemsize = array.itemsize
# broadcast window_size so it will still work with a scalar:
window_size = np.broadcast_to(window_size,[2,])
shape = (array.shape[0] - window_size[0] + 1,
array.shape[1] - window_size[1] + 1,
window_size[0], window_size[1])
# the following would also work:
# shape = (*np.array(array.shape) - window_size + 1, *window_size)
strides = (array.shape[1] * itemsize, itemsize,
array.shape[1] * itemsize, itemsize)
return np.lib.stride_tricks.as_strided(array, shape=shape, strides=strides)
roller = np.arange(1,16).reshape(3,5)
>>> print(roller)
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]
run = rolling_window(roller,[2,3])
>>> run
array([[[[ 1, 2, 3],
[ 6, 7, 8]],
[[ 2, 3, 4],
[ 7, 8, 9]],
[[ 3, 4, 5],
[ 8, 9, 10]]],
[[[ 6, 7, 8],
[11, 12, 13]],
[[ 7, 8, 9],
[12, 13, 14]],
[[ 8, 9, 10],
[13, 14, 15]]]])
推荐阅读
- javascript - 动态追加元素 jquery 和 javascript 类
- laravel - Laravel 从包中获取应用程序的翻译
- ios - cocoapod 中的资源文件设置为错误的目标
- r - 将函数的结果导出到 .rtf
- git - 是否可以复制 gitlab 项目?
- google-apps-script - 参考错误 $ 未在 onFormSubmit 中定义
- php - 如何限制 Laravel 中的页面链接数量?
- mongodb - 带有 symfony 3.4 的 mongodb 地图集
- matlab - MATLAB Gurobi [in cvx] 求解器失败
- java - 如何遍历一个类中的多个枚举