如何按数组元素的第一项排序



让我们假设我有一个形式的数组

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] ], 
] 

我想按每个元素的第一列排序,所以a的第一个条目将为:

[ [2, 2, 10, 2], [7, 10, 3 ,2], [10, 12, 4, 2], [12, 4, 2, 5] ]

我找到了一个类似a[a[:,1].argsort()]的解决方案,并尝试在第一个索引上进行for循环,如:

for i in range(0,4):
a[i,...] = a[a[i,0,:].argsort()]

for i in range(0,4):
a[i,...] = a[i, a[i,0,:].argsort()]

这不管用。我真的无法理解这个问题。

您可以使用沿第一列索引的数组的argsort,并适当扩展dims,然后使用np.take_along_axis:

ixs = a[...,0].argsort(1)[...,None]
np.take_along_axis(a, ixs, 1)
array([[[ 2,  2, 10,  2],
[ 7, 10,  3,  2],
[10, 12,  4,  2],
[12,  4,  2,  5]],
[[ 2,  2, 12,  1],
[ 7, 10,  3,  2],
[10, 12,  4,  2],
[13, 23,  4,  5]],
[[ 2,  2,  3,  2],
[ 4,  4,  2,  5],
[ 7, 10,  3,  2],
[10, 12,  4,  2]]])

尝试:

sorted_array = [sorted(x, key=lambda y: y[0]) for x in a]

这是怎么回事?

  • 首先,我们使用列表理解将数组a映射到新的数组中,对每个元素(例如[x + 1 for x in my_numbers](执行操作

  • 我们对a的每个元素执行的操作是使用sorted。这返回一个数组的副本,通过比较key返回的值进行排序。

  • key必须是一个返回"可排序"值的函数。这里,我们使用lambda来创建一个单行函数,该函数返回传递给它的数组中的第一个项。这确保了我们根据a中每个元素的第一列进行排序。

如果您不想使用lambda方法,请尝试以下方法:

def select(item):
return item[0]

s_array=[]
for i in a:
s_array.append(sorted(i, key=select))

最新更新