You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一二维数组的秩对两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:35:51