Python中两段for循环的向量化实现方法求助
两段for循环的向量化实现方案
第一段循环:生成one-hot矩阵out
你已经知道用dir_int = np.random.randint(low=0, high=d, size=N)生成索引数组,要实现每行对应dir_int指定列设为1,有两种高效的向量化方式:
方式1:高级索引赋值
out = np.zeros((N, d)) out[np.arange(N), dir_int] = 1
np.arange(N)生成行索引数组,dir_int对应每行的目标列索引,numpy的高级索引会自动匹配两者的位置,直接完成赋值操作,完全替代原循环。
方式2:单位矩阵索引
如果维度d不大,也可以直接用单位矩阵提取行:
out = np.eye(d)[dir_int]
np.eye(d)是d×d的单位矩阵,用dir_int作为行索引,取出对应的行即可得到N×d的one-hot矩阵。
第二段循环:upper和lower的向量化更新
原循环的核心逻辑是对每个样本,提取两个特定位置的元素,计算极值后更新对应位置的数值,我们可以通过向量运算直接完成:
完整向量化代码
# 提取两个关键向量 val1 = bmAx[np.arange(N), dir_int] val2 = -bmAx[np.arange(N), d + dir_int] # 批量计算最大值和最小值 max_vals = np.maximum(val1, val2) min_vals = np.minimum(val1, val2) # 批量更新upper和lower矩阵 upper[np.arange(N), dir_int] += max_vals lower[np.arange(N), dir_int] += min_vals
逻辑拆解
- 提取目标元素:用高级索引一次性取出所有样本对应的
bmAx[i, dir_int[i]]和bmAx[i, d+dir_int[i]],再对后者取负得到val2; - 批量计算极值:用
np.maximum和np.minimum直接对两个向量做逐元素的极值计算,得到每个样本对应的最大、最小值数组; - 批量更新矩阵:再次用高级索引将极值数组加到
upper和lower的对应位置。
整合后的完整优化代码
import numpy as np # 替换为你的实际N和d值 N = 100 d = 10 # 第一段循环优化 dir_int = np.random.randint(low=0, high=d, size=N) out = np.zeros((N, d)) out[np.arange(N), dir_int] = 1 # 第二段循环优化(假设x、b已提前定义) bmAx = b - np.concatenate((x, -x), axis=1) upper = np.copy(x) lower = np.copy(x) val1 = bmAx[np.arange(N), dir_int] val2 = -bmAx[np.arange(N), d + dir_int] max_vals = np.maximum(val1, val2) min_vals = np.minimum(val1, val2) upper[np.arange(N), dir_int] += max_vals lower[np.arange(N), dir_int] += min_vals
内容的提问来源于stack exchange,提问作者Ruzayqat
相关产品推荐
相关产品推荐

