前提・実現したいこと
以下のコードを作成しました。
pDM = np.arrray([125., 256., 785., 34., 85., 73., 14., 3., 4.] [12., 26., 85., 3., 5., 713., 154., 32., 45.] [25., 26., 75., 134., 185., 273., 314., 33., 45.]) pGas = np.array([0.3, 4.5, 46.]) boxSize = 876. def dist2(dx, dy, dz): return dx*dx + dy*dy + dz*dz
のような要素数の異なるpDMとpGasが存在します。
python
1DM_adress = np.sqrt(dist2(pGas[1,0]-pDM[:,0], pGas[1,1]-pDM[:,1], pGas[1,2]-pDM[:,2], boxSize)) < (boxSize/512.0) 2for k in range(pGas.shape[0])[1:]: 3 DM_adress2 = np.sqrt(dist2(pGas[k,0]-pDM[:,0], pGas[k,1]-pDM[:,1], pGas[k,2]-pDM[:,2])) < (boxSize/512.0) 4 DM_adress = np.vstack((DM_adress, DM_adress2))
(このとき,出来たDM_adress2を足し合わせる方法が分からなくて始めにk=0でDM_adressを作成して,それにfor文内でDM_adress2を足し合わせるという方法をとりました。)
並列計算の試行
実際はlen(pGas) > 10000, len(pDM) > 10^8 あり,この方法だと8時間以上回してもfor文の計算が終わりませんでした。
そこで並列処理を行おうとして以下のコードを作成しました。
python
1from multiprocessing import Pool 2def find_DMadress(k): 3 found_DMad = np.sqrt(dist2(pGas[k,0]-pDM[:,0], pGas[k,1]-pDM[:,1], pGas[k,2]-pDM[:,2])) < (boxSize/512.0) 4 return found_DMad 5 6with Pool(processes=16) as p: 7 DM_adress = p.map(find_DMadress, pGas)
最後のDM_adressの部分を書いていて手が止まってしまいました。
そこで質問は以下の通りです。
① 上の様に並列計算を行ったとき,found_DMadでは1次元配列が出来ますが、p.mapで出来るDM_adressには(len(pGas), len(pDM))の2次元配列ができるのでしょうか? 出来る為にはどのように変更すればよろしいでしょうか?
② 別の並列処理の方法を使用する等で、pGasとpDMの全ての行の組み合わせを行えるようにpGas, pDMの二つを引数にとって並列処理をすることは出来るのでしょうか?
①②それぞれ調べてもよく分からなかったので質問いたしました。
長文失礼いたしました。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
python3