Python优化三重循环计算,实现无循环索引查找与result更新
优化三重循环的NumPy向量化实现
问题背景
现有变量:
intensity:(480, 640) 形状的NumPy数组L:固定值256result:初始全0,形状与intensity一致
当前三重循环代码运行效率极低,需求是找到intensity中满足np.round(intensity[l][w]*255+1) == index的元素,用该元素值计算并更新result;补充要求:单个index匹配多个元素时,取最后一个匹配到的元素的计算值进行赋值。
方案1:对应原代码逻辑(逐像素独立计算)
原代码本质是每个像素根据自身计算出的索引idx,取对应gamma[idx]做幂运算。用NumPy向量化操作完全替代循环,性能会有数量级提升:
import numpy as np # 计算所有像素对应的索引,转为整数类型 idx = np.round(intensity * 255 + 1).astype(np.int32) # 向量化逐元素计算并赋值 result = (intensity / intensity_max) ** gamma[idx]
说明:NumPy底层基于C实现数组操作,自动处理逐元素运算,无需手动遍历维度,速度远超Python嵌套循环。
方案2:匹配补充说明逻辑(同index批量赋值最后匹配元素的计算值)
如果需求是:对每个index,找到最后一个满足条件的intensity元素,将所有该index对应的result位置统一设为该元素的计算值,可按以下方式实现:
import numpy as np # 1. 计算所有像素的索引 idx = np.round(intensity * 255 + 1).astype(np.int32) # 2. 展平数组,遍历一次记录每个index的最后匹配元素 flat_int = intensity.flatten() flat_idx = idx.flatten() last_match = {} # 顺序遍历,最后一次赋值即为该index的最后匹配元素 for val, idx_val in zip(flat_int, flat_idx): last_match[idx_val] = val # 3. 生成每个index对应的计算结果 calc_map = {k: (v / intensity_max) ** gamma[k] for k, v in last_match.items()} # 4. 批量赋值到result result = np.zeros_like(intensity, dtype=np.float64) for idx_val, calc_val in calc_map.items(): result[idx == idx_val] = calc_val
说明:仅做一次一维循环记录最后匹配元素,再通过布尔索引批量赋值,避免了原代码的三重嵌套循环,效率大幅提升。
内容的提问来源于stack exchange,提问作者KEZIA ANGELINE
相关产品推荐
相关产品推荐

