<p>简而言之,我认为这就是循环的作用:</p>
<pre><code>upgain=np.array([.1,.2,.3,.4])
u=[]
up=1
for x in upgain:
u1=10*up+x
u.append(u1)
up=u1
</code></pre>
<p>制作:</p>
^{pr2}$
<p>这里有<code>np.cumprod([10,10,10,10])</code>,加上<code>[.1,.2,.3,.4]</code>项的修改后的<code>cumsum</code>。但是我不能马上想到一种将这些函数与编译的<code>numpy</code>函数相结合的方法。我们可以编写一个自定义的<code>ufunc</code>,并使用它的<code>accumulate</code>。或者我们可以在<code>cython</code>(或其他<code>c</code>接口)中编写它。在</p>
<p><a href="https://stackoverflow.com/a/27912352">https://stackoverflow.com/a/27912352</a>表明<code>frompyfunc</code>是一种编写广义<code>accumulate</code>的方法。我不希望节省很多时间,也许是2倍</p>
<hr/>
<p>要使用<code>frompyfunc</code>,请定义:</p>
<pre><code>def foo(x,y):return 10*x+y
</code></pre>
<p>循环应用程序(上面)将是</p>
<pre><code>def loopfoo(upgain,u,u1):
for x in upgain:
u1=foo(u1,x)
u.append(u1)
return u
</code></pre>
<p>“矢量化”版本为:</p>
<pre><code>vfoo=np.frompyfunc(foo,2,1) # 2 in arg, 1 out
vfoo.accumulate(upgain,dtype=object).astype(float)
</code></pre>
<p><code>dtype=object</code>需求已在前面的SO中指出,并且<a href="https://github.com/numpy/numpy/issues/4155" rel="nofollow noreferrer">https://github.com/numpy/numpy/issues/4155</a></p>
<pre><code>In [1195]: loopfoo([1,.1,.2,.3,.4],[],0)
Out[1195]: [1, 10.1, 101.2, 1012.3, 10123.4]
In [1196]: vfoo.accumulate([1,.1,.2,.3,.4],dtype=object)
Out[1196]: array([1.0, 10.1, 101.2, 1012.3, 10123.4], dtype=object)
</code></pre>
<p>对于这个小列表,<code>loopfoo</code>更快(3µs v 21µs)</p>
<p>对于100元素数组,例如<code>biggain=np.linspace(.1,1,100)</code>,<code>vfoo.accumulate</code>更快:</p>
<pre><code>In [1199]: timeit loopfoo(biggain,[],0)
1000 loops, best of 3: 281 µs per loop
In [1200]: timeit vfoo.accumulate(biggain,dtype=object)
10000 loops, best of 3: 57.4 µs per loop
</code></pre>
<p>对于更大的<code>biggain=np.linspace(.001,.01,1000)</code>(为避免溢出,较小的数字),5x速比仍然存在。在</p>