如何用Numpy实现从三个向量构建2D数组并累加重复索引值?
解决Numpy重复索引位置值累加的问题
直接使用A[X,Y] += Z无法实现重复索引的累加效果,原因是Numpy的花式索引会先提取所有索引对应的元素生成临时数组,完成加法操作后再将结果赋值回原数组——重复索引的位置只会保留最后一次赋值的结果,而非逐步累加。
以下是两种Numpy原生高效解决方案:
方法一:使用np.add.at()
这是Numpy专门针对原地累加重复索引设计的函数,直接操作原数组,不会产生临时数组,性能接近原生C实现。
import numpy as np X = [0,1,1] Y = [2,2,2] Z = [1,2,3] A = np.zeros([3, 3], dtype=int8) np.add.at(A, (X, Y), Z) print(A)
输出结果:
array([[0, 0, 1], [0, 0, 5], [0, 0, 0]], dtype=int8)
方法二:使用np.bincount()
将二维索引转换为一维扁平索引后,用bincount统计每个索引位置的累加值,最后重塑为二维数组。该方法适合数据量较大的场景,性能表现优异。
import numpy as np X = [0,1,1] Y = [2,2,2] Z = [1,2,3] # 把二维索引转换为一维扁平索引 flat_indices = np.ravel_multi_index((X, Y), (3, 3)) # 计算每个索引位置的累加值 counts = np.bincount(flat_indices, weights=Z, minlength=3*3) # 重塑为目标二维数组 A = counts.reshape(3, 3).astype(int8) print(A)
输出结果:
array([[0, 0, 1], [0, 0, 5], [0, 0, 0]], dtype=int8)
内容的提问来源于stack exchange,提问作者Erasmo Calzadilla
相关产品推荐
相关产品推荐

