如何生成基于时序数组的移位汉克尔矩阵?
高效生成扩展汉克尔矩阵(针对大规模时序数据)
你需要的这种矩阵本质是固定窗口大小的滑动窗口矩阵,而非传统补0的汉克尔矩阵。针对大规模数据,优先使用基于numpy内存视图的方法,避免数据复制,保证效率。
方法1:使用numpy滑动窗口视图(推荐)
numpy 1.20.0及以上版本提供了np.lib.stride_tricks.sliding_window_view,它直接返回原数组的视图,不复制数据,内存效率和运算速度都极高,适合处理超大规模时序数组。
import numpy as np X2 = np.array([1, 2, 3, 4, 5, 6, 7]) window_size = 4 # 对应原问题中用于生成汉克尔矩阵的初始元素长度 # 生成目标矩阵 target_matrix = np.lib.stride_tricks.sliding_window_view(X2, window_shape=window_size) print(target_matrix)
输出结果:
array([[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7]])
方法2:低版本numpy兼容实现
如果你的numpy版本低于1.20.0,可以用np.lib.stride_tricks.as_strided手动实现滑动窗口,同样基于内存视图,效率一致:
import numpy as np def sliding_window(arr, window_size): arr_length = arr.size if window_size > arr_length: raise ValueError("窗口大小不能超过数组长度") elem_stride = arr.strides[0] return np.lib.stride_tricks.as_strided( arr, shape=(arr_length - window_size + 1, window_size), strides=(elem_stride, elem_stride) ) X2 = np.array([1, 2, 3, 4, 5, 6, 7]) target_matrix = sliding_window(X2, 4)
方法3:使用scipy.linalg.hankel(内存效率稍低)
如果一定要用scipy的hankel函数,可以通过指定c参数(矩阵最后一行)来实现,但该方法会创建数据副本,大规模数据下内存占用更高:
from scipy.linalg import hankel X2 = np.array([1, 2, 3, 4, 5, 6, 7]) window_size = 4 target_matrix = hankel(X2[:window_size], X2[window_size-1:])
内容的提问来源于stack exchange,提问作者Volti
相关产品推荐
相关产品推荐

