如何从多个相同长度的列表中获取numpy数组并沿轴排序?

我有一个非常简单的问题,如何从多个相同长度的列表中获取numpy数组并沿轴排序?

我正在寻找类似的东西:

a = [1,1,2,3,4,5,6]
b = [10,10,11,09,22,20,20]
c = [100,100,111,090,220,200,200]
d = np.asarray(a,b,c)
print d
>>>[[1,10,100],[1,10,100],[2,11,111].........[6,20,200]]

第二个问题:如果可以实现,是否可以沿轴对它排序(例如,在列表b的值上)?

第三个问题:可以在一定范围内进行排序吗?例如对于b 10和b-10之间的值,同时查看列表c进行进一步排序.喜欢

[[1,11,111][1,10,122][1,09,126][1,11,154][1,11,191]
 [1,20,110][1,25,122][1,21,154][1,21,155][1,21,184]]

解决方法:

您可以压缩以获取数组:

a = [1, 1, 2, 3, 4, 5, 6]
b = [10, 10, 11, 9, 22, 20, 20]
c = [100, 100, 111, 90, 220, 200, 200]
d = np.asarray(zip(a,b,c))
print(d)
[[  1  10 100]
 [  1  10 100]
 [  2  11 111]
 [  3   9  90]
 [  4  22 220]
 [  5  20 200]
 [  6  20 200]]

print(d[np.argsort(d[:, 1])]) # a sorted copy
[[  3   9  90]
[  1  10 100]
[  1  10 100]
[  2  11 111]
[  5  20 200]
[  6  20 200]
[  4  22 220]]

我不知道如何不做以下操作就可以进行就地排序:

d = np.asarray(zip(a,b,c))

d.dtype = [("0", int), ("1", int), ("2", int)]
d.shape = d.size
d.sort(order="1")

前导0会使python2中的090八进制或python3中的语法无效,因此我将其删除.

您还可以在传递以下内容之前对压缩后的元素进行排序:

from operator import itemgetter
zipped = sorted(zip(a,b,c),key=itemgetter(1))


d = np.asarray(zipped)
print(d)
[[  3   9  90]
 [  1  10 100]
 [  1  10 100]
 [  2  11 111]
 [  5  20 200]
 [  6  20 200]
 [  4  22 220]]
上一篇:python-如何在不使用循环的情况下使用numpy.lexsort


下一篇:用Java降序选择对象数组