You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成基于时序数组的移位汉克尔矩阵?

高效生成扩展汉克尔矩阵(针对大规模时序数据)

你需要的这种矩阵本质是固定窗口大小的滑动窗口矩阵,而非传统补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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:05:19