【问题标题】:Sort array by other array sort indexing in Python在 Python 中按其他数组排序索引对数组进行排序
【发布时间】:2015-05-13 05:16:00
【问题描述】:

我遇到了一些困难。我正在尝试对python中的一些代码进行矢量化以使其更快。我有一个数组,我排序 (A) 并获取索引列表 (Ind)。我有另一个数组 (B),我想按索引列表排序,而不使用我认为会成为计算瓶颈的循环。

A = array([[2, 1, 9],
           [1, 1, 5],
           [7, 4, 1]])
Ind = np.argsort(A)

这是 Ind 的结果:

Ind = array([[1, 0, 2],
             [0, 1, 2],
             [2, 1, 0]], dtype=int64)

B 是我想按 Ind 排序的数组:

B = array([[ 6,  3,  9],
           [ 1,  5,  3],
           [ 2,  7, 13]])

我想使用Ind 重新排列B 中的元素(B 行按A 行索引排序):

B = array([[ 3,  6,  9],
           [ 1,  5,  3],
           [13,  7,  2]])

有什么想法吗?我很高兴得到任何好的建议。我想提一下我正在使用数百万个值,我的意思是 30000*5000 的数组。

干杯, 罗伯特

【问题讨论】:

  • 您正在创建Ind,然后立即在下一行覆盖它,仅供参考。
  • 我只是想展示 Ind 的结果。
  • 我不知道...使用 cmets 或 smth;当您明显覆盖刚刚创建的内容时,这会令人困惑;另外,在我们使用它的同时,请查看python.org/dev/peps/pep-0008 - 从长远来看,您可能会发现它很有用。
  • 我会用与结果相同的值来覆盖它...我不是来这里打架的,我在这里解决问题...我感谢 cmets 并感谢您的提醒

标签: python arrays sorting numpy multidimensional-array


【解决方案1】:

我会这样做:

import numpy as np
from numpy import array

A = array([[2, 1, 9],
           [1, 1, 5],
           [7, 4, 1]])
Ind = np.argsort(A)

B = array([[ 3,  6,  9],
           [ 1,  5,  3],
           [13,  7,  2]])

# an array of the same shape as A and B with row numbers for each element
rownums = np.tile(np.arange(3), (3, 1)).T

new_B = np.take(B, rownums * 3 + Ind)
print(new_B)
# [[ 6  3  9]
#  [ 1  5  3]
#  [ 2  7 13]]

您可以用数组形状替换幻数3

【讨论】:

  • 您可以使用广播而不是np.tile 来获取行索引:rownums = np.arange(3); B[rownums[:, None], Ind]
  • 好点,如果数组很大,它会很有用。而且你的索引方式看起来比我的更清晰。
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
相关资源
最近更新 更多