【问题标题】:Undo sorting of multidimensional numpy array along specific axis撤消沿特定轴对多维 numpy 数组的排序
【发布时间】:2020-01-15 11:02:57
【问题描述】:

我正在沿轴对一个大型多维 numpy 数组进行排序。 经过一些计算后,我想撤消排序,因为值本身与我进行初始排序时不同。

最初我尝试通过简单地反转排序索引,但如果数组首先已经正确排序,这当然没有任何意义,请参见下面的代码。

import numpy as np

array = np.random.rand(100,2,4)
array.out = array

arg = array.argsort(axis=1)
arg_rev = arg.argsort(axis=1)

# this solution is based on https://github.com/numpy/numpy/issues/4724

for i in range(0, array.shape[2]):
    tmp = array[:,:,i]
    array.out[:,:,i] = tmp[np.arange(np.shape(tmp)[0])[:, np.newaxis],  arg_ftc_rev[:,:,i]]



我想将此解决方案与来自 undo or reverse argsort(), python 的解决方案结合起来,而不必循环额外的数组索引。

# ( a = np.random.randint(0,10,10)
# aa = np.argsort(a)
# aaa = np.argsort(aa) )
# e.g.
array.out[:,:,i] = tmp[np.arange(np.shape(tmp)[0])[:, np.newaxis],  arg_ftc[:,:,i][arg_ftc_rev[:,:,i]]

但这不起作用,因为它会导致错误的形状。

【问题讨论】:

  • “更改值后撤消排序”是一个非常模糊的概念。你能提供一个你想要完成的例子(带数据)吗?
  • 使用this answer末尾的inverse_permutation函数来反转argsort的结果。
  • @jdehesa 我试过python import numpy as np array = np.random.rand(100,2,4) arg = array.argsort(axis=1) x = inverse_permutation(arg) ,但是因为无法广播而出现错误。
  • @ScottHunter 我的意思是每个元素在排序轴上的位置应该与开头一样,但是其中的值将被修改。因此,简单地再次排序是没有选择的,例如python x = [1, 3, 1, 6] x = sort(x) # [1, 1, 3, 6] x = x*2 # [2, 2, 6, 12] # undo sorting # [2, 6, 2, 12]

标签: python numpy sorting multidimensional-array


【解决方案1】:

这是一个愚蠢的错误

array.out[:,:,i] = tmp[np.arange(np.shape(tmp)[0])[:, np.newaxis], arg_ftc[:,:,i][arg_ftc_rev[:,:,i]]

需要

array.out[:,:,i] = tmp[np.arange(np.shape(tmp)[0])[:, np.newaxis], [arg_ftc_rev[:,:,i]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 2021-05-19
    • 1970-01-01
    • 2011-09-03
    • 2011-05-28
    • 2020-06-21
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多