2014-09-25 80 views
1

更新numpy的阵列顺序我有一个numpy的阵列v,我想用数组的当前元素上的功能更新每个元素:如何在没有环路

v[i] = f(v, i) 

一个基本的方式做这是使用一个循环

for i in xrange(2, len(v)): 
    v[i] = f(v, i) 

因此用于更新诉值[I]是更新阵列v。有没有办法做这些更新没有循环?

例如,

v = [f(v, i) for i in xrange(len(v))] 

由于V不工作[I-1]当在综合列表用于不被更新。

i将函数˚F可以取决于在列表上的几个元素,那些具有索引低于我应该更新和那些与比我尚未更新索引时,如下面的例子:

v = [1, 2, 3, 4, 5] 
f = lambda v, i: (v[i-1] + v[i])/v[i+1] # for i = [1,3] 
f = lambda v, i: v[i]      # for i = {0,4} 

它应该返回

v = [1, (1+2)/3, (1+4)/4, ((5/4)+4)/5, 5] 

回答

1

你可以使用和sum功能v[i]之前的数字:

>>> v = [v[i] + sum(v[:i]) for i in xrange(len(v))] 
>>> v 
[1, 3, 6, 10, 15] 

或以更好的方式,你可以使用np.cumsum()

>>> np.cumsum(v) 
array([ 1, 3, 6, 10, 15]) 
+0

考虑numpy的在大型阵列使用,O(N²)算法,实际上会比一个纯Python循环更差,这甚至没有矢量化。 – Veedrac 2014-09-25 18:09:23

2

有这个功能:

import numpy 

v = numpy.array([1, 2, 3, 4, 5]) 

numpy.add.accumulate(v) 
#>>> array([ 1, 3, 6, 10, 15]) 

这适用于许多不同类型的ufunc

numpy.multiply.accumulate(v) 
#>>> array([ 1, 2, 6, 24, 120]) 

对于这种类型的任意函数o ˚F积累,你可以让自己的ufunc,虽然这将是很慢:

myfunc = numpy.frompyfunc(lambda x, y: x + y, 2, 1) 
myfunc.accumulate([1, 2, 3], dtype=object) 
#>>> array([1, 3, 6], dtype=object) 
+0

如果仅使用索引i-1更新索引i处的v,则此方法运行良好。但它不适用于像f(v [i])= v [i-1] + v [i] + v [i + 1]这样的函数,因为累加只需要带两个参数的函数。 – haaronn 2014-09-29 15:40:03

+0

我编辑了我的问题来添加f有三个参数的情况。 – haaronn 2014-09-29 15:49:10

+0

@haron你应该问一个新的问题。 – Veedrac 2014-09-29 16:02:03