<p>这是一种使用<code>reshaping</code>和置换维度的矢量化方法-</p>
<pre><code>a.reshape(3,3,3,3).transpose(2,0,1,3).reshape(9,3,3)
</code></pre>
<p>样本运行-</p>
<pre><code>In [197]: a
Out[197]:
array([[1, 3, 2, 5, 7, 9, 4, 6, 8],
[4, 9, 8, 2, 6, 1, 3, 7, 5],
[7, 5, 6, 3, 8, 4, 2, 1, 9],
[6, 4, 3, 1, 5, 8, 7, 9, 2],
[5, 2, 1, 7, 9, 3, 8, 4, 6],
[9, 8, 7, 4, 2, 6, 5, 3, 1],
[2, 1, 4, 9, 3, 5, 6, 8, 7],
[3, 6, 5, 8, 1, 7, 9, 2, 4],
[8, 7, 9, 6, 4, 2, 1, 5, 3]])
In [198]: a.reshape(3,3,3,3).transpose(2,0,1,3).reshape(9,3,3)
Out[198]:
array([[[1, 3, 2],
[4, 9, 8],
[7, 5, 6]],
[[6, 4, 3],
[5, 2, 1],
[9, 8, 7]],
[[2, 1, 4],
[3, 6, 5],
[8, 7, 9]], ....
</code></pre>
<p>如果您需要展平每个这样的部分/窗口,只需调整最后的重塑,就像这样-</p>
<pre><code>In [199]: a.reshape(3,3,3,3).transpose(2,0,1,3).reshape(9,9)
Out[199]:
array([[1, 3, 2, 4, 9, 8, 7, 5, 6],
[6, 4, 3, 5, 2, 1, 9, 8, 7],
[2, 1, 4, 3, 6, 5, 8, 7, 9],
[5, 7, 9, 2, 6, 1, 3, 8, 4],
[1, 5, 8, 7, 9, 3, 4, 2, 6],
[9, 3, 5, 8, 1, 7, 6, 4, 2],
[4, 6, 8, 3, 7, 5, 2, 1, 9],
[7, 9, 2, 8, 4, 6, 5, 3, 1],
[6, 8, 7, 9, 2, 4, 1, 5, 3]])
</code></pre>