Python2和Python3中的map函数区别

5

我是一个初学者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()

在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])

在Python3中,我得到了以下结果:

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

如果我改变这个:
v = np.array(map(F_inverse, u.rvs(n)))

to

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

它在两个上都可以正常工作,但我想使用数组。 有没有办法使用np.array让它工作?


值得一提的是,当只涉及一个迭代器时,在Py3中list(map(foo, bar))与在Py2中的map(foo, bar)完全等价。因此,如果后者在Py2的某个地方起作用,并且在Py3上必须以这种方式工作,则将其替换为前者即可,它将正常工作。 - ShadowRanger
1个回答

3

map 对象 转换为列表,然后传递给 numpy.array

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

您可以使用列表推导式而不是map来创建一个列表,而不是一个映射对象:

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

但是,你不需要使用map或者列表推导式;直接调用F_inverse就可以了,因为F_inverse使用了向量化操作:

v = F_inverse(u.rvs(n))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接