如何基于另一二维数组的秩对两个Numpy二维数组同步排序?
基于Numpy的数组同步排序方案
直接使用Numpy的向量化操作就能高效解决这个问题,完全不需要Python循环,适合处理超大数据集。
核心思路
不需要先通过rankdata生成秩,直接用np.argsort获取arr_data沿行(axis=1)的排序索引,再用这个索引同步对arr_data和weights进行排序。
完整代码示例
import numpy as np # 定义原始数组 arr_data = np.array( [[0.3, 0.1, 0.7, 0.5], [0.1, 0.5, 0.4, 0.07]] ) weights = np.array( [[0.05, 0.1, 0.35, 0.5], [0.2, 0.4, 0.1, 0.3]] ) # 获取沿行的排序索引(从小到大排列) sort_indices = np.argsort(arr_data, axis=1) # 对两个数组同步排序 sorted_data = np.take_along_axis(arr_data, sort_indices, axis=1) sorted_weights = np.take_along_axis(weights, sort_indices, axis=1) # 验证结果 print("arr_data排序后:") print(sorted_data) print("\nweights排序后:") print(sorted_weights) # 排序后数组对应元素相乘 result = sorted_data * sorted_weights print("\n相乘结果:") print(result)
输出结果
arr_data排序后: [[0.1 0.3 0.5 0.7 ] [0.07 0.1 0.4 0.5 ]] weights排序后: [[0.1 0.05 0.5 0.35] [0.3 0.2 0.1 0.4 ]] 相乘结果: [[0.01 0.015 0.25 0.245] [0.021 0.02 0.04 0.2 ]]
如果你已经生成了秩数组
如果一定要基于已有的ranks(1-based)处理,只需将秩转换为0-based索引,再用同样的方法排序:
import numpy as np import scipy.stats.rankdata arr_data = np.array( [[0.3, 0.1, 0.7, 0.5], [0.1, 0.5, 0.4, 0.07]] ) weights = np.array( [[0.05, 0.1, 0.35, 0.5], [0.2, 0.4, 0.1, 0.3]] ) # 生成秩数组 ranks = scipy.stats.rankdata(arr_data, axis=1).astype(int) # 转换为0-based索引 rank_indices = ranks - 1 # 同步排序 sorted_data = np.take_along_axis(arr_data, rank_indices, axis=1) sorted_weights = np.take_along_axis(weights, rank_indices, axis=1)
效率说明
np.argsort和np.take_along_axis都是Numpy底层优化的向量化操作,完全避开了Python层面的循环,处理超大数据集时性能远高于列表循环。
内容的提问来源于stack exchange,提问作者Arika
相关产品推荐
相关产品推荐

