我有两个 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——这不是我排序所依据的元素。为什么是这样?我正在做的事情稳健吗?
最佳答案
原因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
指定 key 时您真正所说的函数,对于可迭代的这个特定元素,获取 [0][1]
处的值。也就是说,按给定元组的第一个元素的第二个值( a
的第二个值)进行排序。
关于python - 对两个列表进行排序——一个是列表的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15446113/