排序两个列表--其中一个是列表的列表

9 浏览
0 Comments

排序两个列表--其中一个是列表的列表

我有两个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,这不是我要排序的元素。为什么会这样?我所做的处理是否稳健?

0
0 Comments

问题的出现原因是在对一个包含多个列表的列表进行排序时,使用了错误的排序键。解决方法是使用正确的排序键。

在这个问题中,我们有一个名为package的列表,它包含了多个列表。每个列表中都包含了两个元素,分别是ab。我们想要根据b的值对package进行排序。

然而,在排序时我们使用了错误的排序键dim[0][1]。这个排序键实际上是指package中的每个元素的ab的值。而正确的排序键应该是item[0][1],它表示package中每个元素中的b的值。

为了确定我们正在根据哪个元素进行排序,可以使用package[x][0][1]来查看具体的排序元素,其中x是该元素的索引。

为了解决这个问题,我们应该使用正确的排序键item[0][1]来对package进行排序。正确的排序方法如下所示:

package.sort(key=lambda item: item[0][1])

这样就可以根据package中每个元素的b的值进行排序了。

0
0 Comments

"Sorting two lists -- one is a list of lists"这个问题的出现的原因是因为在访问列表中的元素时,print package[0][1]是将整个元组作为一个整体进行访问,而sorted是逐个查看给定可迭代对象的每个元素。

你在package中使用了ab进行了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的第二个值进行排序,而不是整个元组。

0
0 Comments

问题:如何将排序后的numpy数组传递给另一个函数?

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

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

这样就可以得到按照第二列排序后的数组。但是,如果想将排序后的numpy数组传递给另一个函数,应该怎么办呢?这个函数由其他人编写,我们不能修改它,它只能接收到有序的数组作为参数。在这种情况下,可以直接将a[indices]作为参数传递给该函数即可。

这个方法非常实用,可以在多个numpy数组之间保持相同的排序顺序,并且可以将排序后的数组传递给其他函数使用。

0