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
相关产品推荐
相关产品推荐

