<p>numpy函数<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.indices.html" rel="noreferrer">^{<cd1>}</a>也可以用于此效果,它的功能也可以从名称中清除。</p>
<pre><code>>>> import numpy as np
>>> np.indices((2,3))
array([[[0, 0, 0],
[1, 1, 1]],
[[0, 1, 2],
[0, 1, 2]]])
</code></pre>
<p>可以认为是y坐标的2×3矩阵和x坐标的2×3矩阵(<code>y,x = np.indices((2,3))</code>)。它可以通过调换轴重铸成詹姆提议的形式:</p>
<pre><code>>>> np.indices((2,3)).transpose((1,2,0))
</code></pre>
<p>它在功能上等同于使用<code>indexing='ij'</code>的<a href="https://stackoverflow.com/a/27258410/2476444">the ^{<cd3>} solution</a>,但不要求您提供坐标数组,当您有许多维度时,这是一个好处。</p>
<pre><code>>>> def f1(shape):
... return np.array(np.meshgrid(*(np.arange(s) for s in shape), indexing='ij'))
...
>>> shape = (200, 31, 15, 4)
>>> np.all(f1(shape) == np.indices(shape))
True
</code></pre>
<p>从时间上看,当考虑到生成<code>meshgrid</code>操作的一维数组所需的时间时,这些解决方案是相似的,但是<code>meshgrid</code>返回一个(数组的)列表,而不是像<code>indices</code>这样的nd数组。通过添加对<code>np.array</code>的额外调用(如上面<code>f1</code>中所做的),与<code>meshgrid</code>相比,<code>indices</code>具有明显的优势:</p>
<pre><code>In [14]: %timeit f1(shape)
100 loops, best of 3: 14 ms per loop
In [15]: %timeit np.indices(shape)
100 loops, best of 3: 5.77 ms per loop
</code></pre>
<p>如果没有对<code>array</code>的额外调用:</p>
<pre><code>In [16]: def f2(shape):
return np.meshgrid(*(np.arange(s) for s in shape), indexing='ij')
.....:
In [17]: %timeit f2(shape)
100 loops, best of 3: 5.78 ms per loop
</code></pre>
<p>不过,在解释计时时一定要小心。这可能不会成为你解决任何问题的瓶颈。</p>
<p>在任何情况下,<code>meshgrid</code>可以做比<code>indices</code>更多的事情,例如生成更通用的<a href="https://en.wikipedia.org/wiki/Regular_grid" rel="noreferrer">rectilinear grid</a>而不是笛卡尔网格,因此在适当的时候使用它们。在本例中,我将使用更具描述性的命名方式<code>indices</code>。</p>