2015-01-31 54 views
0

通常灌装一个numpy的阵列,函数的总和将被这样在python使用任意的函数

fsum = 0 
for k in range(1, N+1): 
    fsum += f(k) 

哪里f是一些函数来完成。

使用numpy的整点是vectorize everything。在这种情况下,对于非常大的N,循环将会很慢。如何使用numpy填充numpy array使用函数f(可能需要多个参数)?

+3

你的例子不适合标题。你没有填充数组,你正在一个简单的值范围内求和一个函数。在'numpy'中,通过使用快速编译代码的函数来表达问题,从而“矢量化”。 – hpaulj 2015-01-31 18:17:12

+0

@hpaulj谢谢指出(+1)。我的(不正确的)假设是我可以通过做这样的事情来填充'numpy'数组:'narray = np.array(f,range)'。对于任何在相同假设条件下犯此错误的人,我都会留下标题。 – Samaursa 2015-01-31 18:57:46

回答

4

首先,我已经扩大你的代码,以实际执行它,包括选择一个特定的F(K)所需的最小:

import numpy as np 

def f(k): 
    return(np.log(k**2)) 

N=8 
fsum = 0 
for k in range(1, N+1): 
    fsum += f(k) 

print fsum 

其中给出和21.209的答案。现在让我们做同样的事情,但矢量化。注意函数f(k)是相同的。

import numpy as np 

def f(k): 
    return(np.log(k**2)) 

N=8 
k = np.array(range(1, N+1)) 
print np.sum(f(k)) 

这给出了相同的答案。关键的区别在于我定义了一个numpy数组来包含您在for循环中迭代的输入。那就是:

k = np.array(range(1, N+1)) 

其中,如果您想更有效,可以简化为:

k = np.arange(1, N+1) 

因为f(K)已写入使用numpy的数学函数的时候,已经向量化。然后,而不是使用含+ =操作的循环,我代替F上的numpy.sum矢量函数(K):

print np.sum(f(k)) 

正如可以看到的结果是更简洁,对于大型阵列它将也要快得多。

+1

好点!我会更新答案。 – ZSG 2015-01-31 18:40:13

+0

比我给出的链接中的答案好得多的解释。谢谢! – Samaursa 2015-01-31 18:58:25