【问题标题】:Sort columns containing numbers in numpy text array based on multiple columns根据多列对 numpy 文本数组中包含数字的列进行排序
【发布时间】:2019-07-02 14:13:24
【问题描述】:

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

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(最近一次调用最后一次):

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

TypeError: 一元操作数类型错误 -: 'numpy.str_'

【问题讨论】:

    标签: python arrays numpy sorting


    【解决方案1】:

    错误说你不能否定numpy.str_ 对象听起来合乎逻辑。 但是为了解决你的问题,我建议你先用逆序和键k[1]对数组进行排序,然后用另外两个键对这个结果进行排序。

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

    【讨论】:

    • 在这个解决方案中,正如@yatu 建议的那样,还需要将类型转换为int(k[...])。问题是对字符串进行数字排序,因为字母顺序不能保证数字顺序。
    • 是的,但我认为您需要按字母顺序排列,而且您的字符串中可能有数字以外的内容。
    【解决方案2】:

    您必须将切片值转换为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')]
    

    【讨论】:

    • 无法比较字符串!!也许我们不能将该字符串转换为整数。
    猜你喜欢
    • 2016-03-17
    • 2018-03-15
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2015-08-21
    相关资源
    最近更新 更多