Numpy循环向量化:错误实现排查及正确定义方法
错误原因分析
原向量化实现obj_vec存在三个关键错误:
元素乘法广播方向错误
rs * pis会将pis视为行向量进行广播,导致rs的每一列与pis对应元素相乘,但原函数中是每一行rs与对应位置的pi(标量)相乘。需要将pis转为列向量才能实现行-wise的正确广播。分母广播不匹配
1 + np.dot(r, f)得到的是一维数组(每个元素对应一行的分母),直接用于除法时会被视为行向量广播,导致每列元素除以对应位置的分母值,而非每行元素除以该行的分母。需将分母转为列向量实现行-wise除法。求和轴方向错误
原函数是将所有行的对应位置元素累加(最终得到与f同维度的数组),但np.sum(out, axis=1)是对每行元素求和(得到行求和的一维数组),完全偏离原函数逻辑,应改为沿axis=0求和。
正确的向量化实现
import numpy as np def obj_vec(f, pis, rs): # 计算每行对应的分母,转为列向量实现行-wise广播 denominators = (1 + np.dot(rs, f)).reshape(-1, 1) # 每行与对应pi相乘后除以该行分母 terms = rs * pis.reshape(-1, 1) / denominators # 沿行方向求和,得到与原函数一致的输出 return np.sum(terms, axis=0) # 测试用例 p = np.array([0.42, 0.08, 0.42, 0.08]) r = np.array([[-1.0, 7.0, -1.0, 0.4], [-1.0, 7.0, 0.5, -1.0], [0.2, -1.0, -1.0, 0.4], [0.2, -1.0, 0.5, -1.0]]) f = np.array([0.25, 0.25, 0.25, 0.25]) # 验证与原函数输出一致 print("原函数输出:", obj(f, p, r)) print("向量化函数输出:", obj_vec(f, p, r))
内容的提问来源于stack exchange,提问作者HJA24
相关产品推荐
相关产品推荐

