Python 如何使用PyTorch快速反转排列?

Python 如何使用PyTorch快速反转排列?,python,pytorch,permutation,inverse,Python,Pytorch,Permutation,Inverse,我不知道如何快速恢复排列洗牌的数组 示例#1: [x,y,z]经过P:[2,0,1]洗牌,我们将获得[z,x,y] 相应的反比应该是P^-1:[1,2,0] 示例#2: [a,b,c,d,e,f]被P:[5,2,0,1,4,3]洗牌,然后我们将得到[f,c,a,b,e,d] 相应的反比应该是P^-1:[2,3,1,5,4,0] 我写了以下基于矩阵乘法的代码(置换矩阵的转置是它的逆),但是当我在模型训练中使用它时,这种方法太慢了。是否存在更快的实现 导入火炬 n=10 x=火炬张量(列表(

我不知道如何快速恢复排列洗牌的数组

示例#1:

  • [x,y,z]
    经过
    P:[2,0,1]
    洗牌,我们将获得
    [z,x,y]
  • 相应的反比应该是
    P^-1:[1,2,0]
示例#2:

  • [a,b,c,d,e,f]
    P:[5,2,0,1,4,3]
    洗牌,然后我们将得到
    [f,c,a,b,e,d]
  • 相应的反比应该是
    P^-1:[2,3,1,5,4,0]
我写了以下基于矩阵乘法的代码(置换矩阵的转置是它的逆),但是当我在模型训练中使用它时,这种方法太慢了。是否存在更快的实现

导入火炬
n=10
x=火炬张量(列表(范围(n)))
打印('原始数组',x)
random_perm_index=torch.randperm(n).long()
perm_矩阵=torch.eye(n)[随机perm_索引].t()
x=x[随机排列指数]
打印('Shuffled',x)
恢复索引=火炬。张量(列表(范围(n))。视图(n,1)
restore_index=perm_matrix.mm(restore_index).view(n).long()
x=x[恢复索引]
打印('Restored',x)

我在年获得了解决方案

>>> import torch
>>> torch.__version__
'1.7.1'
>>> p1 = torch.tensor ([2, 0, 1])
>>> torch.argsort (p1)
tensor([1, 2, 0])
>>> p2 = torch.tensor ([5, 2, 0, 1, 4, 3])
>>> torch.argsort (p2)
tensor([2, 3, 1, 5, 4, 0])