基于多个列对包含numpy文本数组中的数字的列进行排序

问题描述 投票:3回答:2

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

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

Traceback(最近一次调用最后一次):

文件“<ipython-input -...>”,第1行,已排序(A,键= lambda k:(k [0],k [2], - k [1]))

TypeError:一元的坏操作数类型 - :'numpy.str_'

python arrays numpy sorting
2个回答
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')]

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]))
© www.soinside.com 2019 - 2024. All rights reserved.