让我们假设我有一个形式的数组
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))