排序两个列表--其中一个是列表的列表
排序两个列表--其中一个是列表的列表
我有两个numpy数组。一个是N乘M的数组,另一个是N乘1的数组。我想要能够按照M维度中的任意一个元素对第一个列表进行排序,并且希望两个列表保持相同的顺序(即如果我交换列表1的第1行和第15行,我希望列表2的第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]]
我在类似的问题中看到很多类似的情况,其中两个列表都是单维的,例如这个问题(链接:https://stackoverflow.com/questions/9764298/is-it-possible-to-sort-two-listswhich-reference-each-other-in-the-exact-same-w)或者关于对列表中的列表进行排序的问题,例如这个问题(链接:https://stackoverflow.com/questions/3398589/sorting-a-list-of-lists-in-python)。但我找不到我想要的解决方法。
最终我让它工作了:
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,这不是我要排序的元素。为什么会这样?我所做的处理是否稳健?
问题的出现原因是在对一个包含多个列表的列表进行排序时,使用了错误的排序键。解决方法是使用正确的排序键。
在这个问题中,我们有一个名为package
的列表,它包含了多个列表。每个列表中都包含了两个元素,分别是a
和b
。我们想要根据b
的值对package
进行排序。
然而,在排序时我们使用了错误的排序键dim[0][1]
。这个排序键实际上是指package
中的每个元素的a
和b
的值。而正确的排序键应该是item[0][1]
,它表示package
中每个元素中的b
的值。
为了确定我们正在根据哪个元素进行排序,可以使用package[x][0][1]
来查看具体的排序元素,其中x
是该元素的索引。
为了解决这个问题,我们应该使用正确的排序键item[0][1]
来对package
进行排序。正确的排序方法如下所示:
package.sort(key=lambda item: item[0][1])
这样就可以根据package
中每个元素的b
的值进行排序了。
"Sorting two lists -- one is a list of lists"这个问题的出现的原因是因为在访问列表中的元素时,print package[0][1]
是将整个元组作为一个整体进行访问,而sorted
是逐个查看给定可迭代对象的每个元素。
你在package
中使用了a
和b
进行了zip操作:
[([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
函数指定一个键时,你实际上是在说,对于可迭代对象的这个特定元素,请获取[0][1]
处的值。也就是说,按照给定元组的第一个元素的第二个值(a
的第二个值)进行排序。
解决这个问题的方法是将sorted
函数的键指定为lambda
函数,该函数返回元组的第一个元素的第二个值。这样,sorted
函数将按照a
的第二个值进行排序,而不是整个元组。
问题:如何将排序后的numpy数组传递给另一个函数?
解决方法:可以使用np.argsort()
函数将相同的排序顺序应用于多个numpy数组。例如,要按第二列排序,可以使用以下代码:
indices = a[:,1].argsort() print(a[indices]) print(b[indices])
这样就可以得到按照第二列排序后的数组。但是,如果想将排序后的numpy数组传递给另一个函数,应该怎么办呢?这个函数由其他人编写,我们不能修改它,它只能接收到有序的数组作为参数。在这种情况下,可以直接将a[indices]
作为参数传递给该函数即可。
这个方法非常实用,可以在多个numpy数组之间保持相同的排序顺序,并且可以将排序后的数组传递给其他函数使用。