基于多重平局决胜规则的NumPy数组排序实现
NumPy数组多规则排序实现平局决胜机制
原始数组
import numpy as np arr = np.array([[ 5, 5, 5, 6, 9, 6, 6], [10, 4, 10, 3, 5, 3, 3], [10, 3, 10, 4, 5, 3, 4], [ 9, 6, 8, 8, 10, 6, 9], [10, 10, 10, 7, 10, 4, 4], [10, 6, 10, 5, 9, 7, 5], [ 9, 7, 10, 7, 10, 8, 10], [ 8, 5, 10, 7, 10, 7, 10], [ 7, 10, 10, 9, 10, 7, 8]])
当前实现与输出
当前代码先对每行升序排列,再按每行10的数量降序排序:
arr = np.sort(arr, axis=1) arr = arr[(arr==10).sum(axis=1).argsort()][::-1]
当前输出:
array([[ 4, 4, 7, 10, 10, 10, 10], [ 7, 7, 8, 9, 10, 10, 10], [ 5, 7, 7, 8, 10, 10, 10], [ 7, 7, 8, 9, 10, 10, 10], [ 5, 5, 6, 7, 9, 10, 10], [ 3, 3, 4, 4, 5, 10, 10], [ 3, 3, 3, 4, 5, 10, 10], [ 6, 6, 8, 8, 9, 9, 10], [ 5, 5, 5, 6, 6, 6, 9]])
需求补充
需要添加平局决胜规则:当两行10的数量相同时,依次按9、8、7……等数字的数量降序排序,最终得到指定的期望输出。
解决方案
通过生成多维度排序键实现复合排序逻辑:
- 先对每行进行升序排列;
- 生成排序键数组,依次包含每行10、9、8……最小数字的出现次数;
- 利用
np.lexsort实现多规则排序。
完整代码:
import numpy as np # 原始数组 arr = np.array([[ 5, 5, 5, 6, 9, 6, 6], [10, 4, 10, 3, 5, 3, 3], [10, 3, 10, 4, 5, 3, 4], [ 9, 6, 8, 8, 10, 6, 9], [10, 10, 10, 7, 10, 4, 4], [10, 6, 10, 5, 9, 7, 5], [ 9, 7, 10, 7, 10, 8, 10], [ 8, 5, 10, 7, 10, 7, 10], [ 7, 10, 10, 9, 10, 7, 8]]) # 1. 每行升序排列 arr_sorted_rows = np.sort(arr, axis=1) # 2. 生成从大到小的数字序列,用于统计每行出现次数 unique_nums_sorted = np.sort(np.unique(arr))[::-1] # 统计每个数字在每行的出现次数,作为排序键 counts = [(arr_sorted_rows == num).sum(axis=1) for num in unique_nums_sorted] # 3. 使用lexsort排序,反转键顺序以实现优先按大数字次数排序,再反转索引得到降序结果 sorted_indices = np.lexsort(counts[::-1]) final_arr = arr_sorted_rows[sorted_indices[::-1]] print(final_arr)
执行后输出与期望一致:
array([[ 4, 4, 7, 10, 10, 10, 10], [ 7, 7, 8, 9, 10, 10, 10], [ 7, 7, 8, 9, 10, 10, 10], [ 5, 7, 7, 8, 10, 10, 10], [ 5, 5, 6, 7, 9, 10, 10], [ 3, 3, 4, 4, 5, 10, 10], [ 3, 3, 3, 4, 5, 10, 10], [ 6, 6, 8, 8, 9, 9, 10], [ 5, 5, 5, 6, 6, 6, 9]])
内容的提问来源于stack exchange,提问作者Ammar Aldabbagh
相关产品推荐
相关产品推荐

