NumPy中如何无循环实现花式索引式的元素累加操作?
无循环实现目标功能
你可以直接利用NumPy的高级索引特性来实现,不需要循环,也不用np.put_along_axis。因为ix、iy、times这三个数组的长度一致,刚好可以一一对应定位到src中的目标位置,直接对这些位置累加values即可:
import numpy as np src = np.zeros((5,5,10), dtype=np.float64) ix = np.array([4, 0, 0]) iy = np.array([1, 3, 4]) times = np.array([1 ,2, 4]) values = np.array([25., 10., -65.]) # 无循环实现 src[ix, iy, times] += values
原理说明
当你用三个长度相同的一维数组作为多维数组的索引时,NumPy会将它们对应位置的元素组合成一个个坐标:
- 第一个目标位置:
(ix[0], iy[0], times[0]) = (4,1,1),累加values[0]=25. - 第二个目标位置:
(ix[1], iy[1], times[1]) = (0,3,2),累加values[1]=10. - 第三个目标位置:
(ix[2], iy[2], times[2]) = (0,4,4),累加values[2]=-65.
这和你原来的循环逻辑完全一致,但效率更高,是NumPy原生的向量化操作。
内容的提问来源于stack exchange,提问作者Antoine Collet
相关产品推荐
相关产品推荐

