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

基于多重平局决胜规则的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……等数字的数量降序排序,最终得到指定的期望输出。

解决方案

通过生成多维度排序键实现复合排序逻辑:

  1. 先对每行进行升序排列;
  2. 生成排序键数组,依次包含每行10、9、8……最小数字的出现次数;
  3. 利用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:25:36