【问题标题】:sort an array to fit another array with numpy使用 numpy 对数组进行排序以适合另一个数组
【发布时间】:2015-07-14 04:42:16
【问题描述】:

这里有很多关于排序数组的问题,但我找不到解决我的问题的问题(这让我希望我没有想得太复杂)。所以我们开始:

我有两个值相等但顺序不同的数组:

a = np.array([4, 2, 5, 6])
# b = np.random.permutation(a)  # general case
b = np.array([5, 2, 6, 4])

我需要将 b 排序为 a 的索引,所以在这里:

ind = np.array([3, 1, 0, 2])

请注意,我不想更改 a。

【问题讨论】:

  • 在这种情况下,a 已排序...总是正确的?
  • 对不起,我试图让这个例子尽可能简单,实际上它太简单了......在a中交换了2和4

标签: python arrays sorting numpy


【解决方案1】:

broadcasting & np.where 的一种方法-

_,C = np.where(a[:,None] == b)

示例运行 -

In [210]: a = np.array([4, 2, 5, 6])

In [211]: b = np.array([5, 2, 6, 4])

In [212]: _,C = np.where(a[:,None] == b)

In [213]: C
Out[213]: array([3, 1, 0, 2], dtype=int64)

【讨论】:

  • 请注意,如果 ab 很大,这将构建一个 len(a) x len(b) 的布尔数组,根据用例的不同,该数组可能过多。
【解决方案2】:

在这种情况下,a 已经排序。因此,您只需要b 的排序索引。

但是,如果 a 没有排序,你可以这样做

a = array([2, 4, 5, 6])
b = array([5, 2, 6, 4])
b.argsort()[a.argsort()] # array([1, 3, 0, 2])

这使用argsort 方法返回排序ba 所需的索引。

另一个例子:

a = array([4, 2, 5, 6])
b = array([5, 2, 6, 4])
b.argsort()[a.argsort()] # array([3, 1, 0, 2])

【讨论】:

  • 这似乎不适用于具有非唯一元素的数组:a = np.array([4, 4, 2, 5, 6])b = np.array([5, 2, 4, 6, 4])
  • @leo。那是因为缺少argsort
  • 这个答案不正确。正确答案是@MadPhysicist 下面给出的b = a[a.argsort()[b.argsort().argsort()]](但更正了放错位置的括号)。
【解决方案3】:

np.argsort 是它自己的逆。如果y = x[x.argsort()],那么x = y[x.argsort().argsort()]。具体来说,您使用a.argsort()a 转换为排序数组,并使用b.argsort().argsort() 从排序数组转换为b。因此,您可以写:

b = a[a.argsort()][b.argsort().argsort()]

换句话说:

ind = a.argsort()[b.argsort().argsort()]

【讨论】:

  • 第一个代码 sn-p 应该是 b = a[a.argsort()[b.argsort().argsort()]](注意右括号),从第二个 sn-p 可以清楚地看出。
  • @StenL。根据我对索引如何工作的理解,我很确定这两者是等价的。如果你有反例,我很乐意打破我的世界观
  • 啊,你是对的。不过,对于将来遇到此问题的任何人来说,这是正确的答案,而当前标记为正确的答案是不正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
相关资源
最近更新 更多