python中的求和求值

Vei*_*pse 5 python math numpy python-2.7

给定的 z = np.linspace(1,10,100)

计算所有 z 值的总和 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())
Run Code Online (Sandbox Code Playgroud)

有人能告诉我calc_Summation1and 有calc_Summation2什么问题吗?

Jai*_*ime 2

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

\n\n
import numpy as np\n\ncalc = np.sum(z**k * np.exp(-z*z / 2))\n
Run Code Online (Sandbox Code Playgroud)\n\n

np.dot尽管如果您致电np.exp而不是使用,则可以继续使用您的方法math.exp

\n\n
calc = np.dot(z**k, np.exp(-z*z / 2))\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用点确实运行得更快:

\n\n
In [1]: z = np.random.rand(1000)\n\nIn [2]: %timeit np.sum(z**5 * np.exp(-z*z / 2))\n10000 loops, best of 3: 142 \xc2\xb5s per loop\n\nIn [3]: %timeit np.dot(z**5, np.exp(-z*z / 2))\n1000 loops, best of 3: 129 \xc2\xb5s per loop\n\nIn [4]: np.allclose(np.sum(z**5 * np.exp(-z*z / 2)),\n...                 np.dot(z**5, np.exp(-z*z / 2)))\nOut[4]: True\n
Run Code Online (Sandbox Code Playgroud)\n