Solutions for http://quant-econ.net/numpy.html

Tell the notebook to display figures embedded in the browser:

```
In [1]:
```%matplotlib inline

Import numpy and some plotting functionality:

```
In [2]:
```import numpy as np
import matplotlib.pyplot as plt

This code does the job

```
In [3]:
```def p(x, coef):
X = np.empty(len(coef))
X[0] = 1
X[1:] = x
y = np.cumprod(X) # y = [1, x, x**2,...]
return np.dot(coef, y)

Let's test it

```
In [4]:
```coef = np.ones(3)
print coef
print p(1, coef)
# For comparison
q = np.poly1d(coef)
print q(1)

```
```

Here's our first pass at a solution:

```
In [5]:
```from numpy import cumsum
from numpy.random import uniform
class discreteRV:
"""
Generates an array of draws from a discrete random variable with vector of
probabilities given by q.
"""
def __init__(self, q):
"""
The argument q is a NumPy array, or array like, nonnegative and sums
to 1
"""
self.q = q
self.Q = cumsum(q)
def draw(self, k=1):
"""
Returns k draws from q. For each such draw, the value i is returned
with probability q[i].
"""
return self.Q.searchsorted(uniform(0, 1, size=k))

The logic is not obvious, but if you take your time and read it slowly, you will understand

There is a problem here, however

Suppose that `q`

is altered after an instance of `discreteRV`

is created, for example by

```
In [6]:
```q = (0.1, 0.9)
d = discreteRV(q)
d.q = (0.5, 0.5)

The problem is that `Q`

does not change accordingly, and `Q`

is the data used in the `draw`

method

To deal with this, one option is to compute `Q`

every time the draw method is called

But this is inefficient relative to computing `Q`

once off

A better option is to use descriptors

A solution from the quantecon library using descriptors that behaves as we desire can be found here

A solution from the quantecon library can be found here

Here's an example of usage

```
In [9]:
```from quantecon import ECDF
F = ECDF(np.random.randn(1000))
F.plot()

```
```

```
In [ ]:
```