5

I'm a beginner python user and I've ran the following code on both python2.7 and python3.4.3

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

alpha = 1
n = 100

u = stats.uniform(0,1)
F_inverse = lambda u: 1/alpha*np.log(1/(1-u))
v = np.array(map(F_inverse, u.rvs(n)))
print(v)

fig, ax = plt.subplots(1,1)
stats.probplot(v, (1,), dist='expon', plot=ax)
plt.show()

On python2 i get a nice array like this:

array([  2.29133808e+00,   1.63236151e+00,   6.77776227e-01,
         3.33668250e-01,   1.77830890e+00,   3.06193068e-01,
         2.10677775e+00,   1.30525788e-01,   2.97056775e-01,
                           ...
         1.31463775e+00,   1.41840428e-03,   8.60594737e-01,
         1.80644880e-01])

On python3 i get this:

array(<map object at 0x7f8aab6f3ef0>, dtype=object)

If I change this:

v = np.array(map(F_inverse, u.rvs(n)))

to

v = list(map(F_inverse, u.rvs(n)))

it works fine on both but I would want to use an array instead. Is there a way to get this to work with np.array?

1
  • For the record, when only one iterator is involved, list(map(foo, bar)) on Py3 is exactly equivalent to map(foo, bar) on Py2. So if the latter works somewhere on Py2, and it must work that way on Py3, substitute in the former, and it will be fine. Commented Feb 18, 2017 at 2:21

1 Answer 1

3

Convert the map object to list, then pass it to numpy.array.

v = np.array(list(map(F_inverse, u.rvs(n))))

Or use list comprehension instead of map to make a list instead of map object:

v = np.array([F_inverse(x) for x in u.rvs(n)])

But, you don't need to use map or list comprehension is not requierd; just calling F_inverse directly is enough because the F_inverse uses vectorized operations:

v = F_inverse(u.rvs(n))
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.