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

Numpy是否存在可替代循环实现递推方程的向量化矩阵运算方法?

实现方案

这个递推过程可以转化为逐次2x2矩阵乘积的形式,完全可以通过Numpy的底层向量化运算实现,不需要写Python级的显式循环:

推导逻辑

我们先把原递推式改写为线性变换形式,对每一步i有:

α[i+1] = α[i] * (1 - x[i]) + β[i] * (y[i] * γ[i])
β[i+1] = α[i] * (x[i] * χ[i]) + β[i] * (1 - y[i])

对应每一步的变换矩阵M[i]为:

M[i] = [
    [1 - x[i],    y[i] * γ[i]],
    [x[i] * χ[i], 1 - y[i]]
]

最终所有的α、β值,就是初始向量[a0, b0]依次乘上所有M[i]的累积乘积的结果。

代码实现

import numpy as np

def compute_numpy(x, y, χ, γ, a0, b0):
    n = len(x)
    # 构造所有步的变换矩阵,形状为 (n, 2, 2)
    M = np.zeros((n, 2, 2), dtype=np.float64)
    M[:, 0, 0] = 1 - x
    M[:, 0, 1] = y * γ
    M[:, 1, 0] = x * χ
    M[:, 1, 1] = 1 - y
    # 累积矩阵乘积,cum_prod[k] 是 M[0] @ M[1] @ ... @ M[k]
    cum_prod = np.linalg.matmul.accumulate(M, axis=0)
    # 初始向量
    init_vec = np.array([a0, b0])
    # 计算所有中间结果,形状为 (n, 2)
    res = cum_prod @ init_vec
    # 拼接初始值,得到完整的α、β序列
    α = np.concatenate([[a0], res[:, 0]])
    β = np.concatenate([[b0], res[:, 1]])
    return α, β

结果验证

用你提供的测试用例验证,输出和原循环实现完全一致:

x = np.array([0.6, 0.4, 0., 0., 0.9])
y = np.array([0., 0., 0.3, 0.9, 0.])
χ = np.arange(100., 105., 1.)
γ = 1. / (χ - 1.)

α, β = compute_numpy(x, y, χ, γ, 1., 0.)
print(np.array([α, β]))
# 输出:
# [[ 1.          0.4         0.24        0.46621782  0.93661782  0.09366178]
#  [ 0.         60.         76.16       53.312       5.3312     92.99862812]]

性能说明

所有运算都在Numpy的C底层执行,没有Python级循环,当输入数组长度达到1e4以上时,速度会比纯Python循环快几十到上百倍。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:54:02