2

我有两个 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]

我看到很多类似的问题,其中两个列表都是一维的,例如这个问题。或者关于排序列表的问题,例如这个。但我找不到我要找的东西。

最终我得到了这个工作:

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]

但我不明白为什么。给出 0.5 -这 print package[0][1]不是我排序的元素。为什么是这样?我正在做的事情健壮吗?

4

3 回答 3

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]]
于 2013-03-16T06:25:39.263 回答
2

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

您压缩ab输入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您实际上是在说,对于可迭代的这个特定元素,获取值 at [0][1]。也就是说,按给定元组的第一个元素的第二个值(的第二个值a)排序。

于 2013-03-16T06:27:01.350 回答
1

在你的里面package

package[0]因此(a[0], b[0])package[0][1]是 b[0]。

你的包是三层嵌套的。key=lambda dim : dim[0][1]表示您item[0][1]用作排序的键packagepackage由 组成item,并且itemis 是双嵌套的。

要查看您正在排序的元素,请使用package[x][0][1]x 作为该项目的索引

于 2013-03-16T06:26:13.307 回答