< Python、PyTrk、NuMPy、C++等内存中元素的顺序为<a href="https://en.wikipedia.org/wiki/Row-_and_column-major_order" rel="nofollow noreferrer">row-major</a>排序:</p>
<pre><code>[ first, second
third, forth ]
</code></pre>
<p>在matlab、fortran等语言中,顺序为<a href="https://en.wikipedia.org/wiki/Row-_and_column-major_order" rel="nofollow noreferrer">column major</a>:</p>
<pre><code>[ first, third
second, fourth ]
</code></pre>
<p>对于高维张量,这意味着元素的顺序是从最后一维到第一维</p>
<p>您可以使用<a href="https://pytorch.org/docs/stable/generated/torch.arange.html#torch.arange" rel="nofollow noreferrer">^{<cd1>}</a>后跟<a href="https://pytorch.org/docs/stable/tensors.html#torch.Tensor.view" rel="nofollow noreferrer">^{<cd2>}</a>轻松地将其可视化:</p>
<pre class="lang-py prettyprint-override"><code>a = torch.arange(24)
a.view(2,3,4)
</code></pre>
<p>结果与</p>
<blockquote>
<pre><code>tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
</code></pre>
</blockquote>
<p>如您所见,元素首先按行(最后一个维度)排序,然后按列排序,最后按第一个维度排序</p>
<p>当你<code>reshape</code>一个张量时,你不会改变元素的基本顺序,只会改变张量的<code>shape</code>。但是,如果使用<a href="https://pytorch.org/docs/stable/tensors.html#torch.Tensor.permute" rel="nofollow noreferrer">^{<cd5>}</a>张量,则会更改元素的基本顺序</p>
<p>看一下<code>a.view(3,2,4)</code>和<code>a.permute(0,1,2)</code>之间的区别——得到的两个张量的<code>shape</code>是相同的,但不是元素的顺序:</p>
<pre class="lang-py prettyprint-override"><code>In []: a.view(3,2,4)
Out[]:
tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
In []: a.permute(1,0,2)
Out[]:
tensor([[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 8, 9, 10, 11],
[20, 21, 22, 23]]])
</code></pre>