我有两个列向量
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,我在这方面遇到了困难。
答案 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.argsort
和kind = 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)