矢量组合和数组排序

时间:2016-11-28 18:03:06

标签: python-3.x numpy

我有两个列向量

A = [8, 2, 2, 1]
B = ['John', 'Peter', 'Paul', 'Evans']

如何将它们组合成一个

数组
C =

     8     'John'
     2     'Peter'
     2     'Paul'
     1     'Evans'

我如何按升序对C进行排序,以便

C =

     1     'Evans'
     2     'Paul'
     2     'Peter'
     8     'John'

我刚刚从Matlab迁移到python,我在这方面遇到了困难。

2 个答案:

答案 0 :(得分:0)

使用np.column_stack()np.sort()

In [9]: np.column_stack((A, B))
Out[9]: 
array([['8', 'John'],
       ['2', 'Peter'],
       ['2', 'Paul'],
       ['1', 'Evans']], 
      dtype='<U5')

In [10]: 

In [10]: np.sort(np.column_stack((A, B)))[::-1]
Out[10]: 
array([['1', 'Evans'],
       ['2', 'Paul'],
       ['2', 'Peter'],
       ['8', 'John']], 
      dtype='<U5')

答案 1 :(得分:0)

这是一种使用np.argsortkind = mergesort的方法,该方法也维护了获取排序索引排序的顺序。因此,我们可以将输入数组堆叠在列中并使用这些索引进行索引以获得所需的输出,如此 -

In [172]: A
Out[172]: array([8, 2, 2, 1])

In [173]: B
Out[173]: 
array(['John', 'Peter', 'Paul', 'Evans'], 
      dtype='|S5')

In [174]: sidx = A.argsort(kind='mergesort')

In [175]: np.column_stack((A,B))[sidx]
Out[175]: 
array([['1', 'Evans'],
       ['2', 'Peter'],
       ['2', 'Paul'],
       ['8', 'John']], 
      dtype='|S21')

如果您想保留输出数组中第一列的int类型,可以创建一个对象dtype数组,如下所示 -

arr = np.empty((len(A),2),dtype=object)
arr[:,0] = A
arr[:,1] = B
out = arr[sidx] # sidx is same as from previous approach

结果 -

In [189]: out
Out[189]: 
array([[1, 'Evans'],
       [2, 'Peter'],
       [2, 'Paul'],
       [8, 'John']], dtype=object)