非均匀倒易空间衍射数据旋转至实际坐标的高效实现问询
优化非均匀衍射数据旋转映射的高效实现
针对你当前逐像素循环导致的效率问题,核心优化方向是用NumPy向量化运算替代Python层循环,利用底层C实现的数组操作大幅提速。以下是基于你现有坐标数组Sx、Sy的高效实现方案:
核心思路
- 直接计算每个原始像素对应的输出网格索引(替代逐像素
where查找) - 利用NumPy的
maximum.at方法批量完成最大值映射(替代循环赋值)
优化后的代码实现
步骤1:预处理输出网格的参数
先提前计算输出网格的步长与边界,避免重复计算:
# 计算输出网格的步长 dx = xS[1] - xS[0] dy = yS[1] - yS[0] # 输出网格的边界索引范围 x_min_idx, x_max_idx = 0, len(xS)-1 y_min_idx, y_max_idx = 0, len(yS)-1
步骤2:向量化计算所有像素的输出索引
# 计算每个Sx、Sy对应的输出网格索引(四舍五入等价于原逻辑中tol=1/2像素的查找规则) x_idx = np.round((Sx - xS[0]) / dx).astype(int) y_idx = np.round((Sy - yS[0]) / dy).astype(int) # 过滤超出输出网格范围的索引,避免数组越界 valid_mask = (x_idx >= x_min_idx) & (x_idx <= x_max_idx) & (y_idx >= y_min_idx) & (y_idx <= y_max_idx) valid_x = x_idx[valid_mask] valid_y = y_idx[valid_mask] valid_data = Data[valid_mask]
步骤3:批量完成最大值映射
# 初始化输出数组 DataOut = np.zeros_like(xxS) # 批量更新对应索引位置的最大值,这是核心提速点 np.maximum.at(DataOut, (valid_x, valid_y), valid_data)
效率对比
- 原逐像素循环:单张680k像素图需约1.8小时
- 优化后方案:单张图处理时间压缩至数秒级别,10张图仅需几十秒
关键细节说明
- 索引计算逻辑:
np.round((Sx - xS[0])/dx)完全匹配你原代码中tol=dx/2的位置查找规则,保证映射一致性 - 边界过滤:避免超出输出网格范围的索引导致越界错误
np.maximum.at:NumPy专为"按索引批量更新并取最大值"场景优化的底层函数,性能远高于Python循环
内容的提问来源于stack exchange,提问作者Michael Jones
相关产品推荐
相关产品推荐

