基于每行指定区间元素求和结果对NumPy二维数组降序排序
解决方法
针对你的需求,这里提供两种可行的实现方式,优先推荐使用NumPy原生操作(效率更高,适合大规模数组):
方法一:NumPy原生操作(推荐)
- 计算每行指定片段的和:比如你要选取第2到第3个元素(对应NumPy的0-based索引
1:3),对该切片求和 - 根据求和结果的降序获取排序索引
- 用索引对原数组重排
示例代码:
import numpy as np # 你的示例数组 a = np.array([[0.80372444, 0.35468653, 0.9081662 , 0.69995566], [0.53712474, 0.90619077, 0.69068265, 0.73794143], [0.14056974, 0.34685164, 0.87505744, 0.56927803]]) # 计算每行第2-3个元素的和(0-based索引1到2) segment_sums = np.sum(a[:, 1:3], axis=1) # 获取降序排序的索引 sorted_indices = np.argsort(-segment_sums) # 对原数组排序 a_sorted = a[sorted_indices] print(a_sorted)
输出结果:
array([[0.53712474, 0.90619077, 0.69068265, 0.73794143], [0.80372444, 0.35468653, 0.9081662 , 0.69995566], [0.14056974, 0.34685164, 0.87505744, 0.56927803]])
方法二:使用Python内置sorted函数
如果你更习惯Python列表操作,可以自定义key函数,只对指定片段求和,并设置reverse=True实现降序:
import numpy as np a = np.array([[0.80372444, 0.35468653, 0.9081662 , 0.69995566], [0.53712474, 0.90619077, 0.69068265, 0.73794143], [0.14056974, 0.34685164, 0.87505744, 0.56927803]]) # 自定义key:取每行第2-3个元素求和,reverse=True实现降序 a_sorted = np.array(sorted(a, key=lambda row: sum(row[1:3]), reverse=True)) print(a_sorted)
关键说明
- 注意NumPy的索引是0-based:如果你说的"第2到第3个元素"是1-based的表述,对应切片是
1:3(左闭右开,包含索引1和2);如果是其他区间,比如第2到第6个元素,只需调整切片为1:6即可。 - NumPy原生操作避免了数组到列表的转换,在处理大型数组时性能远优于Python的
sorted方法。
内容的提问来源于stack exchange,提问作者Joan
相关产品推荐
相关产品推荐

