如何仅用一次排序/argsort操作实现按另一数组顺序的数组累加和?
问题解答
可以通过一次argsort操作实现需求,避免第二次排序/逆序操作,具体方案如下:
优化代码
import numpy as np arr1 = np.array([1,4,2,5,6,3,2]) arr2 = np.array([1,0,2,4,3,6,5]) sorting_indices = np.argsort(arr2) # 按arr2的排序顺序计算arr1的累加和 sorted_cumsum = np.cumsum(arr1[sorting_indices]) # 直接将累加结果映射回原数组位置 result = np.empty_like(sorted_cumsum) result[sorting_indices] = sorted_cumsum print(result) # 输出:array([ 5, 4, 7, 18, 13, 23, 20])
原理说明
np.argsort(arr2)得到的是将arr2从小到大排序时的原索引序列,示例中sorting_indices = [1,0,2,4,3,6,5],表示arr2中最小的元素在索引1,次小在索引0,以此类推。- 计算
arr1[sorting_indices]的累加和,得到按arr2排序顺序的累计结果sorted_cumsum。 - 通过
result[sorting_indices] = sorted_cumsum,直接将排序后的累加值“放回”到原arr2元素对应的位置:比如sorted_cumsum[0]对应arr2最小元素的位置(索引1),sorted_cumsum[1]对应arr2次小元素的位置(索引0),以此类推,最终得到与需求完全一致的结果。
这种方法只执行了一次argsort操作,相比原方案省去了np.argsort(sorting_indices)的逆序计算,效率更高,逻辑也更直观。
内容的提问来源于stack exchange,提问作者ignoring_gravity
相关产品推荐
相关产品推荐

