擅长:python、mysql、java
<p>你真的想要这个吗?它将值左移,填充最后一列</p>
<pre><code>In [179]: y = np.arange(15).reshape(3,5)
In [180]: y[:,:-1]=y[:,1:]
In [181]: y
Out[181]:
array([[ 1, 2, 3, 4, 4],
[ 6, 7, 8, 9, 9],
[11, 12, 13, 14, 14]])
</code></pre>
<p>对于这样的非标准“滚动”,不太可能有更快的东西。</p>
<p><code>np.roll</code>左边有一个不同的填充</p>
^{pr2}$
<p>就其价值而言,<code>roll</code>的核心是:</p>
<pre><code>indexes = concatenate((arange(n - shift, n), arange(n - shift)))
res = a.take(indexes, axis)
</code></pre>
<p>你的特殊“卷”可以用类似的“take”复制</p>
<pre><code>In [204]: indexes=np.concatenate([np.arange(1,y.shape[1]),[y.shape[1]-1]])
In [205]: y.take(indexes,1)
</code></pre>
<p>您的<code>y[:,:-1]...</code>比<code>roll</code>快,因为它不创建新数组,而是覆盖现有数组的一部分。</p>
<p><code>take</code>接受一个<code>out</code>参数,因此这是可能的:</p>
<pre><code>y.take(indexes,1,y)
</code></pre>
<p>虽然速度方面,这只对小数组有帮助。对于大的,你的重写任务更快。</p>
<p>我还建议使用转置,并在<code>axis=0</code>上滚动。对于<code>order='C'</code>数组,行的值构成一个连续的块。</p>
<p>最大的时间消耗者是您必须(几乎)将阵列的所有内容从一个位置复制到另一个位置,或者复制到新阵列中,或者复制到它本身。如果数据在某种环形缓冲区中,您只需更改指针,而不必复制任何数据。</p>