Numpy数组切片无法对重复索引元素重复执行算术操作的解决方案咨询
解决Numpy重复索引累加问题
Numpy普通索引的+=操作会合并重复索引,所以重复坐标只会加一次——这是因为它先提取所有目标元素的副本,修改后再赋值回去,重复索引对应的元素只会被处理一次。
要高效处理重复索引的累加,直接用Numpy内置的np.add.at函数,它会对每个索引位置逐个执行累加操作,重复索引会多次生效,完全不需要手动遍历。
二维坐标示例
import numpy as np # 包含重复坐标的列表 coords = np.array([[0, 0], [1, 2], [0, 0], [3, 1]]) # 初始化map数组 map_arr = np.zeros((4, 3), dtype=int) # 执行累加操作 np.add.at(map_arr, tuple(coords.T), 10) print(map_arr) # 输出结果: # [[20 0 0] # [ 0 0 10] # [ 0 0 0] # [ 0 10 0]]
一维坐标示例
import numpy as np coords = np.array([2, 5, 2, 2]) map_arr = np.zeros(10, dtype=int) np.add.at(map_arr, coords, 10) print(map_arr[2]) # 输出30,对应3次累加10 print(map_arr[5]) # 输出10
对比普通+=的问题:如果用map_arr[tuple(coords.T)] += 10,二维示例里map_arr[0,0]只会是10,因为重复索引被合并处理了。而np.add.at完美解决了这个问题,且效率和Numpy原生操作一致,远高于Python循环遍历。
内容的提问来源于stack exchange,提问作者imad.nyc
相关产品推荐
相关产品推荐

