<p>有很多方法可以改变数组的维数,只要新维度中大小的乘积与旧维度的乘积相同。在</p>
<p>除一种情况外,在所有情况下,整形操作都会返回一个新的数组对象,但在内存中使用相同的底层数据。这意味着整形是非常便宜的,即使对于巨大的阵列也是如此。您只需将返回的引用分配回原始数组。在</p>
<p>对数组对象进行适当整形的唯一方法是将其<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.shape.html" rel="nofollow noreferrer">^{<cd1>}</a>属性赋值:</p>
<pre><code>arr.shape += (1,)
</code></pre>
<p>添加维度的所有其他方法都返回一个新的数组对象。在大多数情况下,它们不会复制数据,除非您对索引方案做了一些奇怪的操作:</p>
<ol>
<li><p>使用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html" rel="nofollow noreferrer">^{<cd2>}</a>:</p>
<pre><code>arr = np.reshape(arr, arr.shape + (1,))
</code></pre></li>
<li><p>使用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.reshape.html#numpy.ndarray.reshape" rel="nofollow noreferrer">^{<cd3>}</a>。其工作原理与<code>np.reshape</code>完全相同:</p>
<pre><code>arr = arr.reshape(arr.shape + (1,))
</code></pre></li>
<li><p>用<a href="https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#numpy.newaxis" rel="nofollow noreferrer">^{<cd5>}</a>(又称<code>None</code>)索引数组:</p>
<pre><code>arr = arr[..., np.newaxis]
</code></pre>
<p>或者</p>
<pre><code>arr = arr[..., None]
</code></pre>
<p>这将创建一个新的数组对象,在索引方案中插入一个大小为1的新轴,无论您将<code>newaxis</code>对象放在何处,但底层数据保持不变。</p></li>
<li><p>使用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.expand_dims.html" rel="nofollow noreferrer">^{<cd8>}</a>。这将在您通过第二个参数告诉它的任何位置插入一个大小为1的新维度:</p>
<pre><code>arr = np.expand_dims(arr, -1)
</code></pre></li>
<li><p>对于您的特定情况,可以使用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.atleast_3d.html#numpy.atleast_3d" rel="nofollow noreferrer">^{<cd9>}</a>:</p>
<pre><code>arr = np.atleast_3d(arr)
</code></pre>
<p>当给定一个1D输入时,这个函数的行为很奇怪:它将大小为1的维度放在元组的开头和结尾,而不是全部放在一边。不过,2D用例的行为完全符合您的需要。</p></li>
<li><p>使用<a href="https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.array.html" rel="nofollow noreferrer">^{<cd10>}</a>显式创建具有预期维数的新数组对象:</p>
<pre><code>arr = np.array(arr, copy=False, ndmin=3)
</code></pre>
<p>必须显式声明<code>copy=False</code>以避免复制数据。第三个轴将<em>预先添加到形状中,而不是附加到形状中,因此您可能需要执行以下操作:</p>
<pre><code>arr = np.moveaxis(arr, 0, -1)
</code></pre>
<p>对于你的特殊需求,这是目前为止最不可取的选择。</p></li>
</ol>
<p><strong>更新</strong></p>
<p>如果我们把你最初的问题等同于一个图钉,下面是一个解决方案的核重锤:</p>
<pre><code>arr = np.lib.stride_tricks.as_strided(arr, arr.shape + (1,))
</code></pre>
<p>只要记住<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.lib.stride_tricks.as_strided.html" rel="nofollow noreferrer">^{<cd12>}</a>真的是一个核大锤!在</p>