2017-02-18 75 views
4

我是一个初学者蟒蛇用户,我已经跑了两个python2.7和python3.4.3地图在python2 VS python3

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

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

它工作正常,两个,但我想用一个数组来代替。 有没有办法让这个与np.array一起工作?

+0

为了记录在案,当只有一个迭代参与,'名单(图(FOO,吧))'上PY3是完全等同于'地图( foo,bar)'在Py2上。所以如果后者在Py2的某个地方工作,并且它必须在Py3上以这种方式工作,替代前者,并且它会没事的。 – ShadowRanger

回答

3

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

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

或者使用列表理解,而不是地图制作列表,而不是地图对象:

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

但是,你并不需要使用map或列表理解不requierd;只是打电话F_inverse直接就足够,因为F_inverse使用矢量操作:

v = F_inverse(u.rvs(n))