【问题标题】:Concatenate and sort data in python在python中连接和排序数据
【发布时间】:2017-11-14 11:02:50
【问题描述】:

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

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]])

我希望能够 1.将这些数组复制到一个新的单个数组中并 2.对数据进行排序,以便结果如下:

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

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

data = np.hstack((a,b))

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

【问题讨论】:

  • 你描述的不是排序。
  • 那么什么是排序,什么不是排序?
  • 您将[a, b, c][d, e, f] 转换为[a, d, b, e, c, f],而不是sorted([a, d, b, e, c, f])。您对成对的zip([a, b, c], [d, e, f]) 执行排序。
  • 是的,但那是我的问题——如何从 [a, d, b, e, c, f] 到 [a, b, c, d, e, f]。这不是对我的数组进行排序吗?

标签: python arrays sorting numpy


【解决方案1】:

将它们水平堆叠(就像您已经做过的那样),然后获取 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 中所述。

【讨论】:

    【解决方案2】:

    如果你喜欢简短的东西。

    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]])
    

    【讨论】:

      猜你喜欢
      • 2020-06-03
      • 2021-10-22
      • 2017-02-07
      • 1970-01-01
      • 2019-06-19
      • 2019-02-16
      • 2012-03-01
      • 2018-01-10
      • 1970-01-01
      相关资源
      最近更新 更多