python中的求和评估

时间:2014-03-30 06:00:47

标签: python python-2.7 math numpy

鉴于 z = np.linspace(1,10,100)

计算z^k * exp((-z^2)/ 2)

中z的所有值的求和
import numpy as np
import math

def calc_Summation1(z, k):
    ans = 0.0
    for i in range(0, len(z)):`
        ans += math.pow(z[i], k) * math.exp(math.pow(-z[i], 2) / 2)
    return ans

def calc_Summation2(z,k):
     part1 = z**k
     part2 = math.exp(-z**2 / 2)
     return np.dot(part1, part2.transpose())

有人可以告诉我calc_Summation1calc_Summation2有什么问题吗?

3 个答案:

答案 0 :(得分:2)

如果你想用numpy进行矢量化计算,你需要使用numpy的ufuncs。此外,通常的计算方法是:

import numpy as np

calc = np.sum(z**k * np.exp(-z*z / 2))

如果您拨打np.dot而不是np.exp,则可以使用math.exp来保持您的方法:

calc = np.dot(z**k, np.exp(-z*z / 2))

使用dot:

可以更快地运行
In [1]: z = np.random.rand(1000)

In [2]: %timeit np.sum(z**5 * np.exp(-z*z / 2))
10000 loops, best of 3: 142 µs per loop

In [3]: %timeit np.dot(z**5, np.exp(-z*z / 2))
1000 loops, best of 3: 129 µs per loop

In [4]: np.allclose(np.sum(z**5 * np.exp(-z*z / 2)),
...                 np.dot(z**5, np.exp(-z*z / 2)))
Out[4]: True

答案 1 :(得分:1)

我认为这可能是您正在寻找的:

sum(z_i**k * math.exp(-z_i**2 / 2) for z_i in z)

答案 2 :(得分:0)

k=1
def myfun(z_i):
    return z_i**k * math.exp(-z_i**2 / 2)
sum(map(myfun,z))

我们为要求求和的事物定义一个函数,使用map函数将其应用于列表中的每个值,然后对所有这些值求和。必须使用外部变量k稍微有些琐碎。

一个改进是定义一个两个参数函数

def myfun2(z_i,k):
    return z_i**k * math.exp(-z_i**2 / 2)

并使用lambda表达式来评估它

sum(map(lambda x:myfun2(x,1), z))