<p><strong>进近#1</strong></p>
<p>我们可以利用基于<a href="http://www.scipy-lectures.org/advanced/advanced_numpy/#indexing-scheme-strides" rel="nofollow noreferrer">^{<cd1>}</a>的<a href="http://scikit-image.org/docs/dev/api/skimage.util.html#skimage.util.view_as_windows" rel="nofollow noreferrer">^{<cd2>}</a>来获得滑动窗口。<a href="https://stackoverflow.com/a/51890064/">More info on use of ^{<cd3>} based ^{<cd4>}</a>。你知道吗</p>
<p>另外,它接受一个<code>step</code>参数,这非常适合这个问题。因此,实施将是——</p>
<pre><code>from skimage.util.shape import view_as_windows
def ranged_mat(n):
r = np.arange(1,n*(n-1)+2)
return view_as_windows(r,n,step=n-1)
</code></pre>
<p>示例运行-</p>
<pre><code>In [270]: ranged_mat(2)
Out[270]:
array([[1, 2],
[2, 3]])
In [271]: ranged_mat(3)
Out[271]:
array([[1, 2, 3],
[3, 4, 5],
[5, 6, 7]])
In [272]: ranged_mat(4)
Out[272]:
array([[ 1, 2, 3, 4],
[ 4, 5, 6, 7],
[ 7, 8, 9, 10],
[10, 11, 12, 13]])
</code></pre>
<p><strong>进近#2</strong></p>
<p>另一个是<a href="https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html" rel="nofollow noreferrer">^{<cd6>}</a>-</p>
<pre><code>def ranged_mat_v2(n):
r = np.arange(n)
return (n-1)*r[:,None]+r+1
</code></pre>
<p><strong>进近#3</strong></p>
<p>我们还可以使用支持多核处理的<a href="https://github.com/pydata/numexpr/blob/master/doc/user_guide.rst#enabling-intel-vml-support" rel="nofollow noreferrer">^{<cd7>} module</a>,从而在大型<code>n's</code>上获得更好的效率-</p>
<pre><code>import numexpr as ne
def ranged_mat_v3(n):
r = np.arange(n)
r2d = (n-1)*r[:,None]
return ne.evaluate('r2d+r+1')
</code></pre>
<p>利用切片技术,我们的存储效率更高-</p>
<pre><code>def ranged_mat_v4(n):
r = np.arange(n+1)
r0 = r[1:]
r1 = r[:-1,None]*(n-1)
return ne.evaluate('r0+r1')
</code></pre>
<hr/>
<p>计时-</p>
<pre><code>In [423]: %timeit ranged_mat(10000)
273 ms ± 3.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [424]: %timeit ranged_mat_v2(10000)
316 ms ± 2.03 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [425]: %timeit ranged_mat_v3(10000)
176 ms ± 85.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [426]: %timeit ranged_mat_v4(10000)
154 ms ± 82.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
</code></pre>