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

标签 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——这不是我排序所依据的元素。为什么是这样?我正在做的事情稳健吗?

最佳答案

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

您压缩abpackage :

[([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/

相关文章:

python - 如何结合基于ubuntu和nginx的django和wordpress

python - 广播矩阵向量点积

python - 在 1D numpy 数组中的随机位置注入(inject)随机数

python - numpy - 在不继承 ndarray 的情况下将对象列表转换为数组

python - Scipy.optimize.fmin powell 直接参数语法

python - 根据 Julia 中的数据绘制 3D 曲面(使用绘图)

python - 解析 Stackoverflow Posts.xml 数据转储文件使程序崩溃,给出 ascii 编码错误

python - 函数获取 NumPy 数组中的列数,如果它是一维数组则返回 1

python - pytesseract 无法识别二值化图像中的数字

python - python 中 qq-plot(或 probplot)的逐点置信度包络线