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

如何按行和从小到大通用排序Numpy数组?

按行元素和对Numpy数组行排序的通用实现

推荐实现:利用Numpy原生argsort()方法

你的思路方向没问题,但手动循环找最小值的方式效率偏低,Numpy本身提供了更简洁高效的原生方案,能完美适配任意行数的二维数组:

import numpy as np

def sort_rows_by_sum(arr):
    # 计算每行的元素和
    row_sums = np.sum(arr, axis=1)
    # 获取行和从小到大排序后的索引
    sorted_indices = np.argsort(row_sums)
    # 根据索引对原数组的行重新排序
    return arr[sorted_indices]

# 测试示例
# 两行数组测试
test_arr1 = np.array([[0, 4], [5, 0]])
print(sort_rows_by_sum(test_arr1))
# 输出: [[0 4]
#        [5 0]]

# 多行数组测试
test_arr2 = np.array([[0, 4], [5, 0], [1, 2]])
print(sort_rows_by_sum(test_arr2))
# 输出: [[1 2]
#        [0 4]
#        [5 0]]

修复你原有的循环实现

如果坚持要用类似你最初的循环思路,这里给出修复后的版本,解决重复选取和索引处理的问题:

import numpy as np

order_smallest = []
def smallest_sum(xy):
    global order_smallest
    order_smallest = []
    # 复制行和数组,避免修改原计算结果
    sums = np.sum(xy, axis=1).copy()
    row_count = xy.shape[0]
    
    for _ in range(row_count):
        # 找到当前剩余行中最小和的索引
        min_idx = np.argmin(sums)
        # 将对应行加入结果列表
        order_smallest.append(xy[min_idx].tolist())
        # 将已选中的行和设为无穷大,避免重复选取
        sums[min_idx] = np.inf
    
    return np.array(order_smallest)

# 测试
test_arr = np.array([[0, 4], [5, 0], [1, 2]])
print(smallest_sum(test_arr))
# 输出: [[1 2]
#        [0 4]
#        [5 0]]

说明

  • 第一种方法的argsort()是Numpy优化后的原生方法,在数组行数较多时,速度远快于手动循环,是首选方案。
  • 第二种方法通过将已选中行的和设为np.inf,确保每次循环都能定位到剩余行中的最小值,避免重复选取同一行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:10:32