【问题标题】:Simple Torch7 equivalent to numpy.roll相当于 numpy.roll 的简单 Torch7
【发布时间】:2016-04-01 13:00:21
【问题描述】:

有没有像 python 中的 numpy.roll 和 numpy.rollaxis 这样在torch7 中滚动张量的简单方法?

谢谢!

【问题讨论】:

    标签: python numpy lua torch


    【解决方案1】:

    你可以用torch的permute来实现numpy的rollaxis的效果。 rollaxis 需要移动一个轴的开始和结束位置,permute 需要所有轴的新位置。例如。对于 3 维张量 np.rollaxis(x, 0, 3)(将第一个轴移动到末端)将等效于 x:permute(2, 3, 1)

    我不知道 numpy 的 roll 的简单替代品,但 scatter 似乎是一个不错的候选人。使用所需的尺寸和移位后的新元素顺序调用它。 (每行需要一个新的元素顺序。) 以下示例将x 的每一行(包含2 行4 列的随机值)2 沿最后一个轴向右移动:

    th> x = torch.zeros(2, 4):uniform(0, 10)
    th> y = torch.zeros(2, 4):scatter(2, torch.LongTensor{{3, 4, 1, 2}, {3, 4, 1, 2}}, x)
    th> x
     0.7295  3.2218  7.3979  5.5500
     8.4354  3.6722  5.5463  3.4323
    [torch.DoubleTensor of size 2x4]
    th> y
     7.3979  5.5500  0.7295  3.2218
     5.5463  3.4323  8.4354  3.6722
    [torch.DoubleTensor of size 2x4]
    

    【讨论】:

    • 谢谢,numpy 的卷呢?
    • 再次感谢,这可能行得通,但我正在使用很长的张量,所以它不实用......所以我想如果你必须在变体转换中实现变体大小的滚动张量,你会怎么做做吗?
    • 对于一个二维张量 x 移位 n 列,您可以使用以下模式(并将其扩展到 n 维张量):s = x:size()[2]; y = torch.Tensor():resizeAs(x); y[{{}, {1,n}}] = x[{{}, {s-n+1,s}}]; y[{{}, {n+1,s}}] = x[{{}, {1,n}}]; 其中s 是数字列中,第一个y[...] 命令将最后一个n 列复制到y 的第一个n,第二个命令将x 的剩余第一列复制到y 的最后一个。跨度>
    • 我认为应该是y[{{}, {n+1,s}}] = x[{{}, {1,s-n}}],但确实可行!
    【解决方案2】:

    也许你可以试试lutorpy,这样你就可以在python中使用numpy数组,然后将它传递给torch模块并将其转换回来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 2016-12-10
      • 2016-12-09
      • 1970-01-01
      • 2016-01-24
      • 2011-06-03
      • 1970-01-01
      相关资源
      最近更新 更多