<p>您的示例使用<code>numpy</code>方法(我没有安装tensorflow):</p>
<pre><code>In [559]: x = np.array([
...: [
...: [[0.4495, 0.2356],
...: [0.4069, 0.2361],
...: [0.4224, 0.2362]],
...:
...: [[0.4357, 0.6762],
...: [0.4370, 0.6779],
...: [0.4406, 0.6663]]
...: ],
...: [
...: [[0.5796, 0.4047],
...: [0.5655, 0.4080],
...: [0.5431, 0.4035]],
...:
...: [[0.5338, 0.6255],
...: [0.5335, 0.6266],
...: [0.5204, 0.6396]]
...: ]
...: ])
In [560]: x.shape
Out[560]: (2, 2, 3, 2)
In [562]: s1=np.concatenate((x[0,0],x[0,1]), axis=1)
In [563]: s2=np.concatenate((x[1,0],x[1,1]), axis=1)
In [564]: s1.shape
Out[564]: (3, 4)
In [565]: new =np.concatenate((s1,s2), axis=0)
In [566]: new.shape
Out[566]: (6, 4)
In [567]: new.reshape(2,3,4)
Out[567]:
array([[[0.4495, 0.2356, 0.4357, 0.6762],
[0.4069, 0.2361, 0.437 , 0.6779],
[0.4224, 0.2362, 0.4406, 0.6663]],
[[0.5796, 0.4047, 0.5338, 0.6255],
[0.5655, 0.408 , 0.5335, 0.6266],
[0.5431, 0.4035, 0.5204, 0.6396]]])
</code></pre>
<p><code>numpy</code>有一个<code>stack</code>将数组连接到一个新的轴上,因此我们可以跳过最后一个连接并使用</p>
<pre><code>np.stack((s1,s2)) # or
np.array((s1,s2))
</code></pre>
<p>直接的方法是交换中间的两个维度:</p>
<pre><code>In [569]: x.transpose(0,2,1,3).shape
Out[569]: (2, 3, 2, 2)
In [571]: x.transpose(0,2,1,3).reshape(2,3,4)
Out[571]:
array([[[0.4495, 0.2356, 0.4357, 0.6762],
[0.4069, 0.2361, 0.437 , 0.6779],
[0.4224, 0.2362, 0.4406, 0.6663]],
[[0.5796, 0.4047, 0.5338, 0.6255],
[0.5655, 0.408 , 0.5335, 0.6266],
[0.5431, 0.4035, 0.5204, 0.6396]]])
</code></pre>
<p><code>reshape</code>可用于组合“相邻”维度,但不会对基础数据重新排序。也就是说<code>x.ravel()</code>与<code>reshape</code>保持相同。虽然允许将(2,2,3,2)重塑为(2,3,4),但值的明显顺序可能不是您想要的。如果您尝试重塑,这可能更容易看到</p>
<pre><code>In [572]: np.arange(6).reshape(2,3)
Out[572]:
array([[0, 1, 2],
[3, 4, 5]])
In [573]: _.reshape(3,2)
Out[573]:
array([[0, 1],
[2, 3],
[4, 5]])
</code></pre>
<p>将其与转置进行比较:</p>
<pre><code>In [574]: np.arange(6).reshape(2,3).transpose(1,0)
Out[574]:
array([[0, 3],
[1, 4],
[2, 5]])
</code></pre>
<p>我在[569]中所做的转置/交换可能很难理解。有足够多不同的方法对维度进行重新排序,很难一概而论</p>