【发布时间】:2016-04-01 13:00:21
【问题描述】:
有没有像 python 中的 numpy.roll 和 numpy.rollaxis 这样在torch7 中滚动张量的简单方法?
谢谢!
【问题讨论】:
有没有像 python 中的 numpy.roll 和 numpy.rollaxis 这样在torch7 中滚动张量的简单方法?
谢谢!
【问题讨论】:
你可以用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]
【讨论】:
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}}],但确实可行!
也许你可以试试lutorpy,这样你就可以在python中使用numpy数组,然后将它传递给torch模块并将其转换回来。
【讨论】: