使用numpy排序数组

时间:2017-03-15 13:53:13

标签: python sorting numpy lexicographic

我想更改

中列元素的顺序
a = np.asarray(
[[0,1,1,2,2,2,2,3,3,3,4,4,4,4,4,4],
 [4,0,3,0,1,2,5,1,2,5,3,4,6,6,7,7],
 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
 [0,1,0,0,1,1,1,0,0,0,1,1,0,1,0,1]]
)

基于第1-3行的值(基于0)。我的解决方案目前看起来像这样:

a[:, a.transpose()[:, 1].argsort(axis=0)]

array([[1, 2, 2, 3, 2, 3, 1, 4, 0, 4, 2, 3, 4, 4, 4, 4],
       [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1]])

这很好,除了我还要在搜索中包含2-3行(按字典顺序)。理想情况下,我希望最后一行是[0, 1, 0, 1, ..., 0, 1]的结果(第二行充满零也应该被考虑在内,但在这个例子中它包含相同的值)。

1 个答案:

答案 0 :(得分:3)

您需要numpy.lexsort,这相当于argsort,但基于多个排序键;给定多个数组,它返回索引以按顺序对数组进行排序:

  

给定多个排序键,可以将其解释为a中的列   电子表格,lexsort返回一个整数索引数组   按多列描述排序顺序。最后一把钥匙   sequence用于主排序顺序,倒数第二个键   对于二级排序顺序,等等。 keys参数必须是a   可以转换为相同形状的数组的对象序列。   如果为keys参数提供了一个2D数组,那么它的行就是   解释为排序键,排序是根据最后一个   行,倒数第二行等。

a[:, np.lexsort(a[:0:-1])]
#array([[2, 1, 3, 2, 3, 2, 1, 4, 0, 4, 3, 2, 4, 4, 4, 4],
#       [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7],
#       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]])