鉴于
z = np.linspace(1,10,100)
计算z^k * exp((-z^2)/ 2)
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
有什么问题吗?
答案 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))