如何按行和从小到大通用排序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
相关产品推荐
相关产品推荐

