Python中的求和计算

5 投票
3 回答
33522 浏览
提问于 2025-04-18 00:31

给定一个代码:z = np.linspace(1,10,100),这行代码的意思是生成一个从1到10的数字列表,总共有100个数字。

接下来,我们要计算这个列表中每个数字的值,公式是z^k * exp((-z^2)/ 2),也就是每个数字的k次方乘以一个指数函数。

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
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))
4

我觉得这可能就是你想要的内容:

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

如果你想用numpy来加速计算,你需要使用numpy的ufuncs(通用函数)。通常,你的计算方式可能是这样的:

import numpy as np

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

不过,如果你用np.exp来代替math.exp,你也可以继续使用你原来的方法,调用np.dot

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

这样用点乘的方式运行会更快:

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

撰写回答