如何用向量化方式处理含重复索引的NumPy数组修改?
解决NumPy重复索引累加问题及霍夫线变换累加器优化
简化场景:重复索引的正确累加
使用NumPy花式索引arr[idx] += 1时,由于操作基于数组副本修改后再赋值回原数组,重复索引的累加会失效——同一索引的多次操作仅生效一次。
正确的向量化实现
np.add.at是NumPy专为这类场景设计的原地原子操作,完美支持重复索引的累加需求:
一维数组示例
import numpy as np arr = np.zeros(5) idx = [0, 1, 1, 2, 0] np.add.at(arr, idx, 1) print(arr) # 输出: array([2., 2., 1., 0., 0.])
重复单索引示例
arr = np.zeros(1) idx = [0, 0] np.add.at(arr, idx, 1) print(arr) # 输出: array([2.])
实际场景:霍夫线变换累加器优化
实现霍夫线变换时,无需将二维(r, θ)索引扁平化,直接用np.add.at即可高效完成累加器计数:
假设已为每个输入点计算出离散化索引:
r_indices:一维数组,存储每个点在r轴上的索引theta_indices:一维数组,存储每个点在θ轴上的索引
初始化二维累加器后,执行以下代码即可完成所有点的累加:
# 假设r和θ的离散化数量分别为num_r和num_theta accumulator = np.zeros((num_r, num_theta)) np.add.at(accumulator, (r_indices, theta_indices), 1)
这种方式避免了扁平化带来的额外数组操作开销,且np.add.at的性能远优于基于np.unique的分组计数方案,在处理大规模点集时优势尤为明显。
内容的提问来源于stack exchange,提问作者JS S
相关产品推荐
相关产品推荐

