Python 根据值对数组排序并创建新数组

Python 根据值对数组排序并创建新数组,python,arrays,numpy,sorting,Python,Arrays,Numpy,Sorting,想象一个二维数组: a=np.数组[[1,1],[1,0],[0,0],[0,0],[0,0],[1,1],[1,1],[0,1]] 我想根据数组的第一个值对数组进行排序,如下所示: [1,1]、[1,1]、[1,1]、[1,0]、[0,1]、[0,0]、[0,0]、[0,0]] 如果我只是简单地使用一个。排序如下: a[:-1]。排序=0 返回的数组如下所示: array([[1, 1], [1, 1], [1, **1**], [**1**, 1],

想象一个二维数组:

a=np.数组[[1,1],[1,0],[0,0],[0,0],[0,0],[1,1],[1,1],[0,1]]

我想根据数组的第一个值对数组进行排序,如下所示:

[1,1]、[1,1]、[1,1]、[1,0]、[0,1]、[0,0]、[0,0]、[0,0]]

如果我只是简单地使用一个。排序如下:

a[:-1]。排序=0

返回的数组如下所示:

array([[1, 1],
       [1, 1],
       [1, **1**],
       [**1**, 1],
       [0, 0],
       [0, 0],
       [0, 0],
       [0, 0]])

正如您所看到的,粗体1过去是零。为什么函数会翻转我的数字?我在互联网上搜索了一下,没有找到任何答案。

您正在进行的排序是数组中所有列的排序,它们彼此独立, 从本页的第一个示例开始


另请参见此答案,以基于单个列对行进行排序:

您所做的排序是对数组中的所有列进行排序,这些列彼此独立, 从本页的第一个示例开始

另请参见此答案,以基于单个列对行进行排序:

问题在于,当传递axis=0时,numpy sort会对每个列进行独立排序,请参见文档页面。如果要对行进行排序,则可以使用“已排序”:

np.arraysorteda,key=lambda x:x.tolist,reverse=True 在你的情况下,结果是

[[1 1] [1 1] [1 1] [1 0] [0 1] [0 0] [0 0] [0 0]] 问题是,当传递axis=0时,numpy sort会对文档页面上的每一列进行独立排序。如果要对行进行排序,则可以使用“已排序”:

np.arraysorteda,key=lambda x:x.tolist,reverse=True 在你的情况下,结果是

[[1 1] [1 1] [1 1] [1 0] [0 1] [0 0] [0 0] [0 0]] 您可以使用,并分别传递这两列,然后颠倒顺序。lexsort返回给定键的已排序索引。您需要将第一列放在第二列,因为lexsort中的主键是最后一列:

>>> a[np.lexsort((a[:,1], a[:,0]))][::-1]
 
array([[1, 1],
       [1, 1],
       [1, 1],
       [1, 0],
       [0, 1],
       [0, 0],
       [0, 0],
       [0, 0]])
以下是np.lexsort对您的数据的输出:

                 key1     key2 (primary)
>>> np.lexsort((a[:,1], a[:,0]))
 array([2, 3, 4, 7, 1, 0, 5, 6], dtype=int64)
您可以使用,并分别传递这两列,然后颠倒顺序。lexsort返回给定键的已排序索引。您需要将第一列放在第二列,因为lexsort中的主键是最后一列:

>>> a[np.lexsort((a[:,1], a[:,0]))][::-1]
 
array([[1, 1],
       [1, 1],
       [1, 1],
       [1, 0],
       [0, 1],
       [0, 0],
       [0, 0],
       [0, 0]])
以下是np.lexsort对您的数据的输出:

                 key1     key2 (primary)
>>> np.lexsort((a[:,1], a[:,0]))
 array([2, 3, 4, 7, 1, 0, 5, 6], dtype=int64)