根据多列对numpy文本数组中包含数字的列进行排序

时间:2019-02-08 10:42:04

标签: python arrays numpy sorting

如何对以下矩阵进行排序:

import numpy as np

A = np.array([['2', '2', '2', 'd'],
              ['1', '1', '3', 'c'],
              ['1', '13', '1', 'a'],
              ['1', '11', '3', 'b']], dtype='<U2')

是基于文本单元格中的数字还是基于多列?使用列表进行排序的方式如下:

sorted([[2, 2, 2, 'd'],
        [1, 1, 3, 'c'],
        [1, 13, 1, 'a'],
        [1, 11, 3, 'b']], key = lambda k: (k[0],k[2],-k[1]))

Out[1]: [[1, 13, 1, 'a'], [1, 11, 3, 'b'], [1, 1, 3, 'c'], [2, 2, 2, 'd']]

但是我如何对类似于上面的列表的numpy数组A进行排序?

第一次审判没有成功...

sorted(A, key = lambda k: (k[0],k[2],-k[1]))
  

回溯(最近通话最近一次):

     

文件“ ”,第1行,在       sorted(A,key = lambda k:(k [0],k [2],-k [1]))

     

TypeError:一元错误的操作数类型-:'numpy.str _'

2 个答案:

答案 0 :(得分:2)

错误表明您不能否定numpy.str_对象听起来很合逻辑。 但是为了解决您的问题,我建议您首先使用反向顺序和键k[1]对数组进行排序,然后再使用另外两个键对结果进行排序。

t = sorted(A, key = lambda k: k[1], reverse=True)
t = sorted(t, key = lambda k: (k[0],k[2]))

答案 1 :(得分:1)

您必须将切片的值转换为int

sorted(A, key = lambda k: (int(k[0]),int(k[2]),-int(k[1])))

[array(['1', '13', '1', 'a'], dtype='<U2'),
 array(['1', '11', '3', 'b'], dtype='<U2'),
 array(['1', '1', '3', 'c'], dtype='<U2'),
 array(['2', '2', '2', 'd'], dtype='<U2')]