<pre><code>In [100]: A = np.arange(12).reshape(3,4)
</code></pre>
<p>使用“重复”在末尾添加新尺寸:</p>
^{pr2}$
<p>使用“平铺”和“重复”在开始处添加新尺寸:</p>
<pre><code>In [104]: np.tile(A, (2,1,1)).shape
Out[104]: (2, 3, 4)
In [105]: np.repeat(A[None,:,:], 2, axis=0).shape
Out[105]: (2, 3, 4)
</code></pre>
<p>如果我们用平铺在最后一个维度上指定2个重复,则会产生不同的形状</p>
<pre><code>In [106]: np.tile(A, (1,1,2)).shape
Out[106]: (1, 3, 8)
</code></pre>
<p>注意<code>tile</code>关于在维度前面加上repeats元组的内容比形状大。在</p>
<p>但是,如果在计算中使用了扩展数组(如注释中所述),则不需要进行完全重复的复制。可以使用正确形状的临时视图,利用<code>broadcasting</code>。在</p>
<pre><code>In [107]: A1=np.arange(12).reshape(3,4)
In [108]: A2=np.arange(8).reshape(4,2)
In [109]: A3=A1[:,:,None] + A2[None,:,:]
In [110]: A3.shape
Out[110]: (3, 4, 2)
In [111]: A3
Out[111]:
array([[[ 0, 1],
[ 3, 4],
[ 6, 7],
[ 9, 10]],
[[ 4, 5],
[ 7, 8],
[10, 11],
[13, 14]],
[[ 8, 9],
[11, 12],
[14, 15],
[17, 18]]])
</code></pre>
<p>使用<code>None</code>(<code>np.newaxis</code>),数组视图是(3,4,1)和(1,4,2)形状的,它们一起广播为(3,4,2)。在第二种情况下,我可以不使用<code>None</code>,因为广播会自动添加。但是后面的<code>None</code>是必需的。在</p>
<pre><code>In [112]: (A1[:,:,None] + A2).shape
Out[112]: (3, 4, 2)
</code></pre>
<p>要添加一维数组(最后一个维度):</p>
<pre><code>In [113]: (A1[:,:,None] + np.array([1,2])[None,None,:]).shape
Out[113]: (3, 4, 2)
In [114]: (A1[:,:,None] + np.array([1,2])).shape
Out[114]: (3, 4, 2)
</code></pre>
<p>两个基本广播步骤:</p>
<ul>
<li>根据需要添加大小为1的维度作为开始(自动<code>[None,....]</code>)</li>
<li>将所有尺寸为1的尺寸展开为共享尺寸</li>
</ul>
<p>这组计算说明了这一点:</p>
<pre><code>In [117]: np.ones(2) + np.ones(3)
ValueError: operands could not be broadcast together with shapes (2,) (3,)
In [118]: np.ones(2) + np.ones((1,3))
ValueError: operands could not be broadcast together with shapes (2,) (1,3)
In [119]: np.ones(2) + np.ones((3,1))
Out[119]:
array([[2., 2.],
[2., 2.],
[2., 2.]])
In [120]: np.ones((1,2)) + np.ones((3,1))
Out[120]:
array([[2., 2.],
[2., 2.],
[2., 2.]])
</code></pre>
<hr/>
<p>缺少中间维度</p>
<pre><code>In [126]: np.repeat(A[:,None,:],2,axis=1)+np.ones(4)
Out[126]:
array([[[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.]],
[[ 5., 6., 7., 8.],
[ 5., 6., 7., 8.]],
[[ 9., 10., 11., 12.],
[ 9., 10., 11., 12.]]])
</code></pre>
<p>有一种更“先进”的替代方案(但不一定更快):</p>
<pre><code>In [127]: np.broadcast_to(A[:,None,:],(3,2,4))+np.ones(4)
</code></pre>