<p>我注意到您更改了上面的代码,但您原来的代码是:</p>
<pre><code>def one():
TempKern=np.array([1,2,3,4,5])
depth=len(TempKern)
buf=deque(np.zeros((2,3)),maxlen=5)
for i in range(10):
buf.append([[i,i+1,i+2],[i+3,i+4,i+5]])
total= + np.sum([np.asarray(buf)[j]*TempKern[j] for j in range(depth)],axis=0)
print('total')
print(total)
return total
</code></pre>
<p>如果您首先将数组展平以进行计算,那么可以大大简化事情并使其运行得更快一些。在</p>
^{pr2}$
<p>第二个实现返回相同的值,在我的机器上运行速度快4倍</p>
<pre><code>one()
>> [[115 130 145]
[160 175 190]] ~ 100µs / loop
two()
>> array([[115, 130, 145],
[160, 175, 190]]) ~~ 26µs / loop
</code></pre>
<p>您可以这样进一步简化和参数化:</p>
<pre><code>def three(n, array_shape):
buf = np.zeros((n,array_shape[0]*array_shape[1]), dtype=np.int32)
addit = np.arange(1, n+1, dtype=np.int32)
for idx, i in enumerate(range(n, 2*n)):
buf[idx] = np.arange(i, i+n+1)
return (buf.T * addit).sum(axis=1).reshape(array_shape)
</code></pre>
<p><code>three(5, (2,3))</code></p>
<pre><code> >> array([[115, 130, 145],
[160, 175, 190]]) ~ 17µs / loop
</code></pre>
<p>注意,第二个和第三个版本返回一个numpy数组。如果需要,可以使用<code>.tolist()</code>将其强制转换为列表。在</p>
<p>根据您的反馈-编辑以下内容:</p>
<pre><code>def four(array_shape):
n = array_shape[0] * array_shape[1] - 1
buf = []
addit = np.arange(1, n+1, dtype=np.int32)
for idx, i in enumerate(range(n, 2*n)):
buf.append(np.arange(i, i+n+1))
buf = np.asarray(buf)
summed = (buf.T * addit).sum(axis=1)
return summed.reshape(array_shape)
</code></pre>