对两个列表进行排序 - 一个是列表列表

时间:2013-03-16 05:59:04

标签: python numpy

我有两个numpy数组。一个是N乘M,另一个是N乘1.我希望能够按照M维度中的任何一个对第一个列表进行排序,我希望列表保持相同的顺序(即如果我交换第1行和第15行list1,我也希望list2的第1行和第15行交换。)

例如:

import numpy as np
a = np.array([[1,6],[3,4],[2,5]])
b = np.array([[.5],[.8],[.2]])

然后,我希望能够按照a中每行的第一个元素进行排序:

a = [[1,6],[2,5],[3,4]]
b = [[.5],[.2],[.8]]

或者按照a中每行的第二个元素排序,以给出:

a = [[3,4],[2,5],[1,6]]
b = [[.8],[.2],[.5]

我看到很多类似的问题,其中两个列表都是单维的,例如,这个question。或者有关排序列表列表的问题,例如this one。但我找不到我要找的东西。

最终我得到了这个工作:

import numpy as np
a = np.array([[1,6],[3,4],[2,5]])
b = np.array([[.5],[.8],[.2]])
package = zip(a,b)
print package[0][1]
sortedpackage= sorted(package, key=lambda dim: dim[0][1])
d,e = zip(*sortedpackage)
print d
print e

现在这会产生我想要的d和e:

  d = [[3,4],[2,5],[1,6]]
  e = [[.8],[.2],[.5]

但我不明白为什么。 print package[0][1]给出0.5 - 这不是我要排序的元素。为什么是这样?我正在做的很强大吗?

3 个答案:

答案 0 :(得分:2)

要将相同的排序顺序应用于多个numpy数组,可以使用np.argsort()。例如,要按第二列排序:

indices = a[:,1].argsort()
print(a[indices])
print(b[indices])

输出:

[[3 4]
 [2 5]
 [1 6]]

[[ 0.8]
 [ 0.2]
 [ 0.5]]

答案 1 :(得分:2)

print package[0][1]返回0.5的原因是因为它正在“整体”访问元组列表中的数字,而sorted正在查看给定可迭代的每个元素。

您在a中压缩bpackage

[([1, 6], [0.5]),
 ([3, 4], [0.8]),
 ([2, 5], [0.2])]

此时您print package[0][1]。第一个元素是使用package[0] = ([1, 6], [0.5])获得的。下一个索引[1]为您提供了第一个元组第二个元素,因此您获得了0.5

考虑sorted,该函数正在检查可迭代的元素单独。它可能首先查看([1, 6], [0.5]),然后查看([3, 4], [0.8]),依此类推。

因此,当您指定具有lambda函数的键时,您实际上是在说,对于iterable的这个特定元素,请获取[0][1]处的值。也就是说,按给定元组的第一个元素的第二个值(a的第二个值)排序。

答案 2 :(得分:1)

package

package[0](a[0], b[0]) 因此,package[0][1]是b [0]。

你的包是三重嵌套的。 key=lambda dim : dim[0][1]表示您使用item[0][1]作为排序package的密钥。 packageitem组成,item是双嵌套的。

要查看您要排序的元素,请使用package[x][0][1] x作为该项的索引