映射python2与python3

Mon*_*all 5 python arrays numpy higher-order-functions python-3.x

我是初学python用户,我在python2.7和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()
Run Code Online (Sandbox Code Playgroud)

在python2上我得到一个像这样的好数组:

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])
Run Code Online (Sandbox Code Playgroud)

在python3上,我得到这个:

array(<map object at 0x7f8aab6f3ef0>, dtype=object)
Run Code Online (Sandbox Code Playgroud)

如果我改变了这个:

v = np.array(map(F_inverse, u.rvs(n)))
Run Code Online (Sandbox Code Playgroud)

v = list(map(F_inverse, u.rvs(n)))
Run Code Online (Sandbox Code Playgroud)

它在两者上工作正常,但我想要使用数组.有没有办法让这个与np.array一起使用?

fal*_*tru 3

将 转换map object为列表,然后将其传递给numpy.array.

v = np.array(list(map(F_inverse, u.rvs(n))))
Run Code Online (Sandbox Code Playgroud)

或者使用列表理解而不是映射来创建列表而不是映射对象:

v = np.array([F_inverse(x) for x in u.rvs(n)])
Run Code Online (Sandbox Code Playgroud)

但是,您不需要使用map或不需要列表理解;只需直接调用F_inverse就足够了,因为它F_inverse使用向量化操作:

v = F_inverse(u.rvs(n))
Run Code Online (Sandbox Code Playgroud)