# Summation Evaluation in python

## Summation Evaluation in python

I think this might be what youre looking for:

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

If you want to vectorize calculations with numpy, you need to use numpys ufuncs. Also, the usual way of doing you calculation would be:

``````import numpy as np

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

although you can keep your approach using `np.dot` if you call `np.exp` instead of `math.exp`:

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

It does run faster with dot:

``````In : z = np.random.rand(1000)

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

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

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

#### Summation Evaluation in python

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

We define a function for the thing we want to sum, use the `map` function to apply it to each value in the list and then sum all these values. Having to use an external variable `k` is slightly niggling.

A refinement would be to define a two argument function

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

and use a lambda expression to evaluate it

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