【问题标题】:Most efficient way to get sorted indices based on two numpy arrays基于两个 numpy 数组获取排序索引的最有效方法
【发布时间】:2018-12-02 08:00:10
【问题描述】:

我怎样才能得到一个 numpy 数组的排序索引(距离),只考虑来自另一个 numpy 数组(val)的某些索引。

例如,考虑下面的两个 numpy 数组 val 和 distance:

val = np.array([[10, 0,  0,  0,  0],
                [0,  0,  10, 0,  10],
                [0,  10, 10, 0,  0],
                [0,  0,  0,  10, 0],
                [0,  0,  0,  0,  0]])


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

val == 10 的距离是 4、1、3、1、0、2。我想让这些排序为 0、1、1、2、3、4 并从距离返回相应的索引大批。

返回类似:

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

或:

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

因为第二个和第三个元素的距离都是'1',所以我猜索引可以互换。

尝试使用 np.where, np.argsort, np.argpartition, np.unravel_index 的组合,但似乎无法正常工作

【问题讨论】:

  • 那么最终的预期输出是什么?
  • Divakar,我更新了问题。 Yakym,只返回距离(它的值)而不是索引

标签: python numpy


【解决方案1】:

这是masking 的一种方式-

In [20]: mask = val==10

In [21]: np.argwhere(mask)[distance[mask].argsort()]
Out[21]: 
array([[2, 2],
       [1, 2],
       [2, 1],
       [3, 3],
       [1, 4],
       [0, 0]])

【讨论】:

    猜你喜欢
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2020-12-20
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多