【问题标题】:How to sort two-dimensional array by first column as numeric when list of strings? (Python)字符串列表时如何按第一列将二维数组排序为数字? (Python)
【发布时间】:2017-09-23 07:19:44
【问题描述】:

我有一个二维数组,我试图按第一列排序。但是,目前数组中的每个元素都是一个字符串,我希望将第一列视为整数,以便我可以按数字排序(1、2、6、11 ...而不是1、11、224, 23,...)。我正在使用 numpy 包使用x = numpy.loadtxt('file.txt', dtype = 'str', delimiter = '\t') 生成这些数组,这给了我:

array([['140', 'GGC'],
       ['256', 'AGGG'],
       ['841', 'CA'],
       ['46', 'TTATAGG'],
       ['64', 'AGAGAAAGGATTATG'],
       ['156', 'AGC'],
       ['187', 'GGA'],
       ['701', 'TTCG'],
       ['700', 'TC']], 
      dtype='|S15')

1) 我知道我可以使用以下方法将第一列转换为整数:

x[:,0].astype(int)

输出一维数组。但我不确定如何直接对我的二维数组进行更改?

2) 一旦我可以将我的第一列转换(或处理)为整数,我知道我可以使用以下方法进行排序:

sorted(x, key=lambda x: x[0])

但这对我的数据类型来说是最好的方法吗?

【问题讨论】:

    标签: python python-2.7 sorting numpy multidimensional-array


    【解决方案1】:

    由于您使用的是array 数据,您可以使用np.argsort 获取基于第一列的排序索引,然后简单地使用这些索引到数组中,就像这样 -

    x[x[:,0].astype(int).argsort()]
    

    从性能的角度来看,这应该比使用lambda 要好得多,因为使用argsort 然后indexing 都是向量化的方法,可以非常有效地处理数组数据。

    示例运行 -

    In [56]: x
    Out[56]: 
    array([['140', 'GGC'],
           ['256', 'AGGG'],
           ['841', 'CA'],
           ['46', 'TTATAGG'],
           ['64', 'AGAGAAAGGATTATG'],
           ['156', 'AGC'],
           ['187', 'GGA'],
           ['701', 'TTCG'],
           ['700', 'TC']], 
          dtype='|S15')
    
    In [57]: x[x[:,0].astype(int).argsort()]
    Out[57]: 
    array([['46', 'TTATAGG'],
           ['64', 'AGAGAAAGGATTATG'],
           ['140', 'GGC'],
           ['156', 'AGC'],
           ['187', 'GGA'],
           ['256', 'AGGG'],
           ['700', 'TC'],
           ['701', 'TTCG'],
           ['841', 'CA']], 
          dtype='|S15')
    

    【讨论】:

      【解决方案2】:

      对这个数组列表进行排序是最好的方法

      sorted(x, key=lambda x: int(x[0]))
      

      【讨论】:

        【解决方案3】:

        您可以使用numpy 中的内置排序功能:

        import numpy as np
        
        dtype = [('id', int), ('seq', '|S15')]
        x = np.array([('140', 'GGC'),
                      ('256', 'AGGG'),
                      ('841', 'CA'),
                      ('46', 'TTATAGG'),
                      ('64', 'AGAGAAAGGATTATG'),
                      ('156', 'AGC'),
                      ('187', 'GGA'),
                      ('701', 'TTCG'),
                      ('700', 'TC')],
                     dtype=dtype)
        
        x_copy = np.sort(x, order='id') # quicksort
        x_copy = np.sort(x, order='id', kind='mergesort') # stable sort
        x.sort(order='id') # in-place quicksort
        

        在初始化时指定数组列的数据类型,这样您以后不必创建视图,然后运行排序。您可以在第一次从文本文件加载数据时指定dtype= 来做到这一点:

        dtype = [('id', int), ('seq', '|S15')]
        x = numpy.loadtxt('file.txt', dtype=dtype, delimiter = '\t')
        

        np.sort() 创建数组的副本,对于较大的数据集可能会更慢。 x.sort() 就地完成。

        您还可以指定使用的算法。通常,quicksort 是最快的,但是如果您需要稳定的排序,请使用 mergesort - 这是numpy 提供的唯一稳定排序(即如果对[(1, 'GGC'), (1, 'GGA'), ...] 进行排序,则具有相同值的键保留在与排序前的顺序相同,GGC 在 GGA 之前)。

        虽然quicksortmergesort(以线性对数时间运行)相比,quicksort 在二次时间中运行,但实际上quicksort 通常更快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-10
          • 2018-11-23
          • 2015-10-13
          • 1970-01-01
          • 2022-11-20
          • 2018-04-07
          • 2011-01-04
          • 2023-03-27
          相关资源
          最近更新 更多