并行化列upd

2024-06-02 14:07:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要基于对所选值列表的处理(下面代码中的df0['parcels'].values)来更新pandas dataframe的列。代码运行良好,但很长,因为所选值的列表相当长,有45000个值。此代码需要5小时才能完成任务。你知道吗

因为对每个选定值的处理是独立的。为了提高速度,我想尝试将其并行化。你知道吗

import numpy as np
import pandas as pd
from scipy.ndimage import distance_transform_edt as edt

for i in df0['parcels'].values:
    y, x = np.where(parcels == i)
    tmp = parcels[np.min(y) - 5:np.max(y) + 6, np.min(x) - 5:np.max(x) + 6]
    dst = edt(tmp, sampling=r_parcels)
    par = tmp[dst <= 20]
    par = par[par != -9999]
    mod, cnt = ss.mode(par)
    df['parcels'] = df['parcels'].replace(i, mod[0])

Tags: 代码importpandas列表asnpmintmp
1条回答
网友
1楼 · 发布于 2024-06-02 14:07:48

您可以使用多处理中提供的进行并行化。你知道吗

import numpy as np
import pandas as pd
from scipy.ndimage import distance_transform_edt as edt

import multiprocessing as mp

def func(i): # change the body of the loop to function
    y, x = np.where(parcels == i)
    tmp = parcels[np.min(y) - 5:np.max(y) + 6, np.min(x) - 5:np.max(x) + 6]
    dst = edt(tmp, sampling=r_parcels)
    par = tmp[dst <= 20]
    par = par[par != -9999]
    mod, cnt = ss.mode(par)
    return (df['parcels'].replace(i, mod[0]))

num_workers = mp.cpu_count()  
pool = mp.Pool(num_workers)
df['parcels'] = pool.map(func,df0['parcels'].values) # specify the function and arguments to map 
pool.close()
pool.join()

您也可以使用pool.map\u异步()pool.apply\u异步()因为map()正在阻塞。一般来说,并行化的逻辑保持不变。你知道吗

相关问题 更多 >