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

如何按第二列对已按第一列排序的Numpy二维数组进行每3行分组排序?

实现按组内第二列排序的Numpy方案

嘿,这个需求其实很典型,咱们用Numpy的原生操作就能轻松搞定,不用写复杂的循环~先看具体的实现步骤:

1. 先定义原始数组

首先把你给出的数组转换成Numpy数组:

import numpy as np

# 你的原始二维数组(已按第一列排序)
original_arr = np.array([
    [100, 38, 18],
    [134, 332, 16],
    [136, 200, 16],
    [136, 288, 15],
    [138, 160, 17],
    [138, 246, 15],
    [140, 76, 12],
    [140, 116, 12],
    [142, 34, 14]
])

2. 方法一:直观分组排序(适合新手理解)

这种方法把数组拆分成每组3行,然后逐个组按第二列排序,最后拼接回原形状:

group_size = 3  # 每组的行数

# 把二维数组重塑为三维数组:(组数, 每组行数, 列数)
# -1 表示让Numpy自动计算组数(这里9行÷3=3组)
groups = original_arr.reshape(-1, group_size, original_arr.shape[1])

# 遍历每个组,按第二列(索引为1的列)升序排序
sorted_groups = []
for group in groups:
    # np.argsort 获取第二列的排序索引,用这个索引重新排列组内的行
    sorted_group = group[np.argsort(group[:, 1])]
    sorted_groups.append(sorted_group)

# 把排序后的所有组拼接回二维数组
final_result = np.concatenate(sorted_groups, axis=0)

print(final_result)

运行后输出的结果正好是你期望的:

[[100  38  18]
 [136 200  16]
 [134 332  16]
 [138 160  17]
 [138 246  15]
 [136 288  15]
 [142  34  14]
 [140  76  12]
 [140 116  12]]

3. 方法二:向量化操作(高效适合大数据量)

如果你的数组很大,循环会慢一些,可以用全向量化的方式实现,效率更高:

group_size = 3

# 把数组重塑为三维,获取每组内第二列的排序索引(按行排序)
sort_indices = np.argsort(original_arr.reshape(-1, group_size, 3)[:, :, 1], axis=1)

# 生成每个组的起始索引,配合排序索引得到最终的元素位置
group_base_indices = np.arange(original_arr.shape[0] // group_size)[:, None] * group_size
final_indices = (group_base_indices + sort_indices).flatten()

# 按索引提取元素得到结果
final_result = original_arr[final_indices]

这个方法完全不用循环,利用Numpy的广播特性一次性完成所有排序操作,处理大规模数据时优势明显。

关键点解释

  • reshape(-1, group_size, 3):核心是把一维的行索引拆分成“组号+组内行号”的二维结构,方便分组处理。
  • np.argsort(group[:,1]):获取组内第二列元素的升序排列索引,用这个索引重新排列组内的行,就实现了组内按第二列排序的需求。
  • np.concatenate/索引扁平化:把处理后的组重新拼接回原始的二维数组形状。

内容的提问来源于stack exchange,提问作者michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:58:15