<p><strong><em>设置</em></strong></p>
<pre><code>n = 3; m = 5
a = np.array([i * np.eye(n) for i in range(1, 1+m)])
</code></pre>
<hr/>
<p>代替<code>tile</code>,沿轴0使用<code>np.repeat</code>,并使用Fortran样式排序重塑形状。你知道吗</p>
<pre><code>np.repeat(a, n, 0).reshape(m*n, n, n, order='F')
</code></pre>
<p/>
<pre><code>array([[[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]],
[[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]],
[[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]],
[[2., 0., 0.],
[0., 2., 0.],
[0., 0., 2.]],
...
[[5., 0., 0.],
[0., 5., 0.],
[0., 0., 5.]]])
</code></pre>
<p>验证</p>
<pre><code># your approach
A = np.tile(a, (n, 1, 1))
B = np.vstack((A[::m], A[1::m], A[2::m], A[3::m], A[4::m]))
# my approach
usr_B = np.repeat(a, n, 0).reshape(m*n, n, n, order='F')
>>> np.array_equal(B, usr_B)
True
</code></pre>
<p>时间安排</p>
<pre><code>%%timeit
A = np.tile(a, (n, 1, 1))
B = np.vstack((A[::m], A[1::m], A[2::m], A[3::m], A[4::m]))
19 µs ± 57.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
A = np.tile(a, (3, 1, 1))
B = np.swapaxes(A.reshape(3, 5, 3, 3), 0, 1)
B = B.reshape(-1, 3, 3)
11 µs ± 74.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.repeat(a, n, 0).reshape(m*n, n, n, order='F')
2.68 µs ± 21.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
</code></pre>