2017-02-18 8 views
4

Я начинающий пользователь питон, и я побежал следующий код на обоих python2.7 и python3.4.3карта в python2 против 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, Bar))' на 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))