如何先排序列表内单个NumPy数组,再基于列平均值对列表中的NumPy数组排序
对NumPy数组列表先内部排序再按列均值整体排序的实现
需求梳理
你已经完成了列表中每个NumPy数组的内部排序(基于第一列和第二列的lexsort),现在需要对整个数组列表进行排序:
- 你文字描述的排序规则:优先按每个数组第二列的平均值排序,第二列均值相同时,再按第一列的平均值排序
- 你给出的预期排序结果:原第二个数组 → 原第三个数组 → 原第一个数组
先按文字描述实现排序
如果严格按照“优先第二列均值,再第一列均值”的升序逻辑排序,代码如下:
import numpy as np # 原始数据 unsorted = [ np.array([[2.5, 6., 5.1], [3.5, 7., 0.1], [2.5, 7., 0.], [3.5, 6., 0.1]]), np.array([[2.5, 6., 1.], [1.5, 7., 5.2]]), np.array([[1.5, 7., 0.2], [2.5, 7., 1.2]]) ] # 步骤1:每个数组内部排序(你已实现的代码) sorted_arr = [] for i in unsorted: # 按第二列、第一列进行lexsort(lexsort参数是逆序,先排后面的列) i = i[np.lexsort((i[:,0], i[:,1]))] sorted_arr.append(i) # 步骤2:按「第二列均值→第一列均值」升序排序 final_sorted_by_col2 = sorted( sorted_arr, key=lambda arr: (arr[:, 1].mean(), arr[:, 0].mean()) ) # 输出结果 print("按第二列均值优先的排序结果:") for idx, arr in enumerate(final_sorted_by_col2): print(f"第{idx+1}个数组:") print(arr) print("---")
这个代码的输出顺序是:原第二个数组 → 原第一个数组 → 原第三个数组,逻辑是:
- 原第二和原第一数组的第二列均值都是6.5,小于原第三数组的7.0,所以排在前面
- 原第二数组的第一列均值2.0 < 原第一数组的3.0,所以原第二排第一,原第一排第二
实现你给出的预期结果
如果想要得到你给出的「原第二个→原第三→原第一个」的排序结果,对应的规则是优先按第一列均值升序,再按第二列均值升序,只需要调整排序key的顺序即可:
# 步骤2:按「第一列均值→第二列均值」升序排序(匹配你的预期结果) final_sorted_matching = sorted( sorted_arr, key=lambda arr: (arr[:, 0].mean(), arr[:, 1].mean()) ) # 输出预期结果 print("\n匹配你预期的排序结果:") for idx, arr in enumerate(final_sorted_matching): print(f"第{idx+1}个数组:") print(arr) print("---")
这个代码的输出完全符合你的预期,逻辑是:
- 原第二和原第三数组的第一列均值都是2.0,小于原第一数组的3.0,所以排在前面
- 原第二数组的第二列均值6.5 < 原第三数组的7.0,所以原第二排第一,原第三排第二
关键说明
- Python的
sorted函数默认是升序排序,会按元组的元素顺序依次比较,调整元组内的列均值顺序就能改变排序优先级 - 如果需要降序排序,可以在排序key前加负号,比如
key=lambda arr: (-arr[:,1].mean(), arr[:,0].mean())表示第二列均值降序、第一列均值升序
内容的提问来源于stack exchange,提问作者Link_tester
相关产品推荐
相关产品推荐

