我有两个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 - 这不是我要排序的元素。为什么是这样?我正在做的很强大吗?
答案 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
中压缩b
和package
:
[([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
的密钥。 package
由item
组成,item
是双嵌套的。
要查看您要排序的元素,请使用package[x][0][1]
x作为该项的索引