我有一些像这样的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(),但它没有保持列相同。谢谢!
答案 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]])