我有一个二维数组,我试图按第一列排序。但是,目前数组中的每个元素都是一个字符串,我希望第一列被视为一个整数,所以我可以用数字排序(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])
但这是我的数据类型的最佳方式吗?
答案 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)。
虽然quicksort
与mergesort
(以线性对数时间运行)相比在二次时间内运行,但quicksort
通常在实践中更快。