如何在字符串列表中将第一列的二维数组排序为数字? (蟒蛇)

时间:2017-04-26 04:08:21

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

我有一个二维数组,我试图按第一列排序。但是,目前数组中的每个元素都是一个字符串,我希望第一列被视为一个整数,所以我可以用数字排序(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)

输出1-D阵列。但我不确定如何直接对我的二维阵列进行更改?

2)一旦我可以将我的第一列转换(或处理)为整数,我知道我可以使用:

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

但这是我的数据类型的最佳方式吗?

3 个答案:

答案 0 :(得分:2)

由于您使用的是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')

答案 1 :(得分:0)

这是对此数组列表进行排序的最佳方法

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

答案 2 :(得分:0)

您可以使用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'), ...]已排序,具有相同值的键保持与排序之前相同的顺序,GGA之前的GGC)。

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