2015-04-28 4 views
0

Я пытаюсь использовать многопроцессорный процесс, чтобы уменьшить время вычисления функций, зависящих от 2D-массивов с формой 2000x2000. У меня есть 2 массива входных данных для функции, но с p.map он не работает ... (с одним из них в порядке). Как я могу это сделать?Python - многопроцессорный пул с функциями с 2 массивами входов

from multiprocessing import Pool 
from numpy import * 
import time 
tic=time.clock() 

Y=(arange(2000.)) 
X=(arange(2000.)) 
(xx,yy)=meshgrid(X,Y) 


r = sqrt((xx)**2 + (yy)**2) 

theta = (arctan2((yy),(xx))) 

def f(theta,r): 
    return 1.*r**(-3/2.)*cos(-3/2.*theta) 

p = Pool(4) 
print p.map(f, theta,r) 
toc=time.clock() 

print 'Temps=', toc-tic 

и я получаю сообщение об ошибке: «Значение истинности массива более чем с одним элементом является неоднозначным Используйте a.any() или a.All().»

+1

какая версия Python вы используете? ответ может зависеть от него. –

+0

Я использую ipython с python 2.7.8 – user3601754

+1

Возможный дубликат http://stackoverflow.com/questions/5442910/python-multiprocessing-pool-map-for-multiple-arguments –

ответ

1

способ сделать решить то есть zip вход arrays

def f(values): 
    return 1.*values[1]**(-3/2.)*cos(-3/2.*values[0]) 

p = Pool(4) 
print p.map(f, zip(theta, r)) 
+0

Спасибо, что это работает, только одна небольшая проблема. Я получаю список массивов ...: array ([-2.23942628e-05, -2.23605957e-05, -2.23268448 e-05, ..., 7.27439741e-06, 7.27185262e-06, 7.26930745e-06]), массив ... «Как я могу получить массив с такой же формой, как r или тета? – user3601754

+0

О, я вижу Вы хотите, чтобы функция принимала весь массив, а не элемент за элементом. Тогда многопроцессорность, вероятно, не будет сильно ускоряться. В этом случае 'print p.map (f, [[theta, r]]) –

+1

В этом случае вы также могли бы сделать. 'from functools import partial; partial_f = partial (f, theta); res = p.map (partial_f, [r])' –

Смежные вопросы