如何按数组元素首项排序?多维数组排序问题求助
解决三维数组/嵌套列表按子数组首元素排序的问题
看起来你是想对三维结构里的每个二维子数组,按其中一维子数组的首元素进行升序排序对吧?我来帮你理清楚问题所在,然后给出两种场景下的解决方案:
先明确你的需求
你的数组a是一个3层嵌套结构:外层有3个元素,每个元素是包含4个一维数组的列表/二维数组。你需要把每个外层元素里的4个一维数组,按它们的第一个元素从小到大重新排列,比如第一个外层元素排序后变成[[2, 2, 10, 2], [7, 10, 3, 2], [10, 12, 4, 2], [12, 4, 2, 5]]。
问题出在哪?
你之前尝试的a[i,0,:].argsort()或者a[i,a[i,0,:].argsort()]是错误的,因为a[i,0,:]取的是第i个二维子数组的第一行所有元素,而不是所有行的第一个元素。方向搞反了,自然得不到正确的排序索引。
分场景解决
场景1:如果你的a是普通Python嵌套列表
直接用Python内置的sorted()函数,通过key参数指定按每个一维数组的首元素排序即可,代码简单直观:
a = [ [ [12, 4, 2, 5] , [10, 12, 4, 2], [2, 2, 10, 2], [7, 10, 3 ,2] ], [ [13, 23, 4, 5] , [10, 12, 4, 2], [2, 2, 12, 1], [7, 10, 3 ,2] ], [ [4, 4, 2, 5] , [10, 12, 4, 2], [2, 2, 3, 2], [7, 10, 3 ,2] ], ] # 遍历每个外层元素,对其内部的子数组按首元素升序排序 for i in range(len(a)): a[i] = sorted(a[i], key=lambda sub_arr: sub_arr[0]) # 验证第一个元素是否符合预期 print(a[0]) # 输出:[[2, 2, 10, 2], [7, 10, 3, 2], [10, 12, 4, 2], [12, 4, 2, 5]]
场景2:如果你的a是NumPy数组
如果用NumPy处理,需要先取每个二维子数组的第一列(也就是所有行的首元素),然后用argsort()得到排序后的索引,再用这个索引重新排列行:
import numpy as np a = np.array([ [ [12, 4, 2, 5] , [10, 12, 4, 2], [2, 2, 10, 2], [7, 10, 3 ,2] ], [ [13, 23, 4, 5] , [10, 12, 4, 2], [2, 2, 12, 1], [7, 10, 3 ,2] ], [ [4, 4, 2, 5] , [10, 12, 4, 2], [2, 2, 3, 2], [7, 10, 3 ,2] ], ]) # 遍历每个二维子数组进行排序 for i in range(a.shape[0]): # 获取当前二维子数组所有行的首元素,生成排序索引 sort_indices = a[i, :, 0].argsort() # 用索引重新排列当前二维子数组的行 a[i] = a[i, sort_indices, :] # 验证第一个元素 print(a[0]) # 输出: # [[ 2 2 10 2] # [ 7 10 3 2] # [10 12 4 2] # [12 4 2 5]]
这里的关键是a[i, :, 0],它表示取第i个三维切片里的所有行(:)的第0列元素,这样得到的就是每个子数组的首元素,再用argsort()得到排序后的行索引,最后重新排列行就完成了。
内容的提问来源于stack exchange,提问作者Axel Stoll
相关产品推荐
相关产品推荐

