Python中的求和计算
给定一个代码: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_Summation1
和calc_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