How to do this kind of reshape using vectorized method in Pytorch?

username: njtll
cooked: <p>For example, I have a 4x4x4 torch tensor:<br>
x = torch.Tensor([<br>
[[1, 1, 1, 1],<br>
[1, 1, 1, 1],<br>
[1, 1, 1, 1],<br>
[1, 1, 1, 1]],<br>
[[2, 2, 2, 2],<br>
[2, 2, 2, 2],<br>
[2, 2, 2, 2],<br>
[2, 2, 2, 2]],<br>
[[3, 3, 3, 3],<br>
[3, 3, 3, 3],<br>
[3, 3, 3, 3],<br>
[3, 3, 3, 3]],<br>
[[4, 4, 4, 4],<br>
[4, 4, 4, 4],<br>
[4, 4, 4, 4],<br>
[4, 4, 4, 4]]<br>
])<br>
I want to convert it to 1x8x8 tensor as:<br>
([[[1, 2, 1, 2, 1, 2, 1, 2],<br>
[3, 4, 3, 4, 3, 4, 3, 4],<br>
[1, 2, 1, 2, 1, 2, 1, 2],<br>
[3, 4, 3, 4, 3, 4, 3, 4],<br>
[1, 2, 1, 2, 1, 2, 1, 2],<br>
[3, 4, 3, 4, 3, 4, 3, 4],<br>
[1, 2, 1, 2, 1, 2, 1, 2],<br>
[3, 4, 3, 4, 3, 4, 3, 4]]])</p>
<p>How to do this kind of reshape using vectorized method <strong>without using for loop</strong> in Pytorch?</p>

username: ptrblck
cooked: <p>This should work:</p>
<pre><code class="lang-python">y = x.view(2, 2, 4, 4).permute(3, 0, 2, 1).reshape(1, 8, 8)
</code></pre>

username: njtll
cooked: <p>Thank you so much.<br>
And there is a further question:<br>
I have a 8x4x4 torch tensor:<br>
x = torch.Tensor([<br>
[[1, 1, 1, 1],<br>
[1, 1, 1, 1],<br>
[1, 1, 1, 1],<br>
[1, 1, 1, 1]],<br>
[[2, 2, 2, 2],<br>
[2, 2, 2, 2],<br>
[2, 2, 2, 2],<br>
[2, 2, 2, 2]],<br>
[[3, 3, 3, 3],<br>
[3, 3, 3, 3],<br>
[3, 3, 3, 3],<br>
[3, 3, 3, 3]],<br>
[[4, 4, 4, 4],<br>
[4, 4, 4, 4],<br>
[4, 4, 4, 4],<br>
[4, 4, 4, 4]],<br>
[[5, 5, 5, 5],<br>
[5, 5, 5, 5],<br>
[5, 5, 5, 5],<br>
[5, 5, 5, 5]],<br>
[[6, 6, 6, 6],<br>
[6, 6, 6, 6],<br>
[6, 6, 6, 6],<br>
[6, 6, 6, 6]],<br>
[[7, 7, 7, 7],<br>
[7, 7, 7, 7],<br>
[7, 7, 7, 7],<br>
[7, 7, 7, 7]],<br>
[[8, 8, 8, 8],<br>
[8, 8, 8, 8],<br>
[8, 8, 8, 8],<br>
[8, 8, 8, 8]]<br>
])<br>
using your answer it converted to a 2x8x8 tensor as:<br>
tensor([[[1., 2., 1., 2., 1., 2., 1., 2.],<br>
[3., 4., 3., 4., 3., 4., 3., 4.],<br>
[5., 6., 5., 6., 5., 6., 5., 6.],<br>
[7., 8., 7., 8., 7., 8., 7., 8.],<br>
[1., 2., 1., 2., 1., 2., 1., 2.],<br>
[3., 4., 3., 4., 3., 4., 3., 4.],<br>
[5., 6., 5., 6., 5., 6., 5., 6.],<br>
[7., 8., 7., 8., 7., 8., 7., 8.]],</p>
<pre><code>    [[1., 2., 1., 2., 1., 2., 1., 2.],
     [3., 4., 3., 4., 3., 4., 3., 4.],
     [5., 6., 5., 6., 5., 6., 5., 6.],
     [7., 8., 7., 8., 7., 8., 7., 8.],
     [1., 2., 1., 2., 1., 2., 1., 2.],
     [3., 4., 3., 4., 3., 4., 3., 4.],
     [5., 6., 5., 6., 5., 6., 5., 6.],
     [7., 8., 7., 8., 7., 8., 7., 8.]]])
</code></pre>
<p>but I want to get a 2x8x8 tensor as:<br>
tensor([[[1., 2., 1., 2., 1., 2., 1., 2.],<br>
[3., 4., 3., 4., 3., 4., 3., 4.],<br>
[1., 2., 1., 2., 1., 2., 1., 2.],<br>
[3., 4., 3., 4., 3., 4., 3., 4.],<br>
[1., 2., 1., 2., 1., 2., 1., 2.],<br>
[3., 4., 3., 4., 3., 4., 3., 4.],<br>
[1., 2., 1., 2., 1., 2., 1., 2.],<br>
[3., 4., 3., 4., 3., 4., 3., 4.]],</p>
<pre><code>    [[5., 6., 5., 6., 5., 6., 5., 6.],
     [7., 8., 7., 8., 7., 8., 7., 8.],
     [5., 6., 5., 6., 5., 6., 5., 6.],
     [7., 8., 7., 8., 7., 8., 7., 8.],
     [5., 6., 5., 6., 5., 6., 5., 6.],
     [7., 8., 7., 8., 7., 8., 7., 8.],
     [5., 6., 5., 6., 5., 6., 5., 6.],
     [7., 8., 7., 8., 7., 8., 7., 8.]]])
</code></pre>
<p>Could you help me? Thanks a lot!</p>

username: Preetham_R_Patlolla
cooked: <p>Just curious about this…<br>
Can’t we use only tensor.rehsape by avoiding .view and .permute? What difference does it make?</p>

username: ptrblck
cooked: <p><code>tensor.reshape</code> copies the data under the hood, if needed for the <code>view</code> operation (which would otherwise yield an error explaining your data is not contiguous in memory and you thus cannot change its strides and shapes since it would overlap). It’s not a replacement for <code>permute</code>, but for <code>.contiguous().view()</code>.</p>