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

基于连续数组切片/滚动生成矩阵的高效实现方法问询

高效构建目标三角矩阵M1及滚动矩阵M2的方法

先明确需求:给定数组 a = [10, 20, 30, 40],我们需要生成下三角矩阵 M1,以及中间过渡的滚动矩阵 M2。如果你的当前方案是先构建M2再用np.tril提取下三角得到M1,那其实可以用更高效的方式直接生成M1,或者优化M2的构建逻辑。


一、直接构建M1的高效方法

不需要先生成冗余的M2矩阵,我们可以利用numpy的滑动窗口和数组填充特性一步到位:

import numpy as np

def build_M1(a):
    a = np.asarray(a)
    n = len(a)
    # 反转数组后在前面补n-1个0,得到长度为2n-1的数组
    padded = np.pad(a[::-1], (n-1, 0), mode='constant')
    # 滑动窗口取每个长度为n的窗口,再反转每个窗口得到M1
    M1 = np.flip(np.lib.stride_tricks.sliding_window_view(padded, n), axis=1)
    return M1

# 测试
a = [10, 20, 30, 40]
print(build_M1(a))

输出结果:

[[10  0  0  0]
 [20 10  0  0]
 [30 20 10  0]
 [40 30 20 10]]

这个方法直接通过滑动窗口操作生成目标下三角矩阵,内存和时间效率都更高,省去了生成M2的额外开销。


二、优化M2的构建方法

如果确实需要生成M2,我们可以用向量化操作替代逐行拼接,利用numpy的广播特性一次性计算所有元素的索引:

import numpy as np

def build_M2(a):
    a = np.asarray(a)
    n = len(a)
    # 生成行索引和列索引的网格
    rows, cols = np.ogrid[:n, :n]
    # 计算每个位置对应的数组索引:下三角用rows-cols,上三角用n-(cols-rows)
    idx = np.where(cols <= rows, rows - cols, n - (cols - rows))
    return a[idx]

# 测试
a = [10, 20, 30, 40]
print(build_M2(a))

输出结果:

[[10 20 30 40]
 [20 10 40 30]
 [30 20 10 40]
 [40 30 20 10]]

这种方法避免了循环拼接的低效操作,尤其当数组长度较大时,向量化运算的性能优势会非常明显。


内容的提问来源于stack exchange,提问作者javidcf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:32:51