2013-01-31 53 views
2

我宣布一个多维数组,可以接受不同的数据类型使用numpy排序一个python多维数组?

count_array = numpy.empty((len(list), 2), dtype = numpy.object)

第一阵列得到串和第二已得到号码。我想根据数字对两列进行排序...

有没有更简单的方法可以像sort()这样做?

回答

3

你可以argsort第二列,然后用所谓的“神奇索引”的行:

import numpy as np 
count_array = np.array([('foo',2),('bar',5),('baz',0)], dtype = np.object) 
print(count_array) 
# [[foo 2] 
# [bar 5] 
# [baz 0]] 

idx = np.argsort(count_array[:, 1]) 
print(idx) 
# [2 0 1] 

print(count_array[idx]) 
# [[baz 0] 
# [foo 2] 
# [bar 5]] 
4

考虑对你的阵列结构数组代替:

count_array = np.empty((len(list),), dtype=[('str', 'S10'), ('num', int)]) 

然后,您可以按特定键排序:

np.sort(arr, order='num') 
0

我提出这一个:

首先,像unutbu,我会用numpy.array建立列表

import numpy as np 
count_array = np.array([('foo',2),('bar',5),('baz',0)], dtype = np.object) 

然后,我用那种operator.itemgetter

import operator 
newlist = sorted(count_array, key=operator.itemgetter(1)) 

这意味着:排序count_array w.r.t.索引为1的参数,即整数值。

输出是

[array([baz, 0], dtype=object), array([foo, 2], dtype=object), array([bar, 5], dtype=object)] 

,我可以重新排列。我这样做与

np.array([list(k) for k in newlist], dtype=np.object) 

和我得到相同格式的numpy的数组作为前

array([[baz, 0], 
     [foo, 2], 
     [bar, 5]], dtype=object) 

最后,整个代码看起来像

import numpy as np 
import operator 

count_array = np.array([('foo',2),('bar',5),('baz',0)], dtype = np.object) 

np.array([list(k) for k in sorted(count_array, key=operator.itemgetter(1))], dtype=np.object) 

与最后一行做请求排序。