在python中连接和排序数据

时间:2017-06-12 20:44:31

标签: python arrays sorting numpy

我有一些像这样的numpy数组:

DateTime

我希望能够将这些数组复制到一个新的单个数组中,然后对数据进行排序,结果如下:

import numpy as np
a = np.array([[1, 2, 3, 4, 5], [14, 16, 17, 27, 38]])
b = np.array([[1, 2, 3, 4, 5], [.4, .2, .5, .1, .6]])

或者,换句话说,我需要原始数组中的所有列都是相同的,只是按升序排列。我试过这个:

data = [[1, 1, 2, 2, 3, 3, 4, 4, 5, 5], [14, .4, 16, .2, 17, .5, 27, .1, 38, .6]]

这给了我附加数据,但我不确定如何对其进行排序。我尝试了np.sort(),但它没有保持列相同。谢谢!

2 个答案:

答案 0 :(得分:3)

水平堆叠(如您所做的那样),然后获取argsort索引以排序第一行,并使用它们对堆叠数组中的所有列进行排序。

因此,我们需要再添加一个步骤,如此 -

ab = np.hstack((a,b))
out = ab[:,ab[0].argsort()]

示例运行 -

In [370]: a
Out[370]: 
array([[ 1,  2,  3,  4,  5],
       [14, 16, 17, 27, 38]])

In [371]: b
Out[371]: 
array([[ 1. ,  2. ,  3. ,  4. ,  5. ],
       [ 0.4,  0.2,  0.5,  0.1,  0.6]])

In [372]: ab = np.hstack((a,b))

In [373]: print ab[:,ab[0].argsort()]
[[  1.    1.    2.    2.    3.    3.    4.    4.    5.    5. ]
 [ 14.    0.4  16.    0.2  17.    0.5  27.    0.1  38.    0.6]]

请注意,为了保留相同元素的顺序,我们需要使用kind='mergesort'argsort一起使用docs中所述。

答案 1 :(得分:0)

如果你喜欢简短的话。

np.array(zip(*sorted(zip(*np.hstack((a,b))))))

>>> array([[  1. ,   1. ,   2. ,   2. ,   3. ,   3. ,   4. ,   4. ,   5. ,   5. ],
   [  0.4,  14. ,   0.2,  16. ,   0.5,  17. ,   0.1,  27. ,   0.6,  38. ]])

保留第二个元素顺序的版本:

np.array(zip(*sorted(zip(*np.hstack((a,b))),key=lambda x:x[0])))

>>>array([[  1. ,   1. ,   2. ,   2. ,   3. ,   3. ,   4. ,   4. ,   5. ,   5. ],
          [ 14. ,   0.4,  16. ,   0.2,  17. ,   0.5,  27. ,   0.1,  38. ,0.6]])