Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多处理一个函数';s输出到单个数组_Python_Arrays_Numpy_Multiprocessing - Fatal编程技术网

Python 多处理一个函数';s输出到单个数组

Python 多处理一个函数';s输出到单个数组,python,arrays,numpy,multiprocessing,Python,Arrays,Numpy,Multiprocessing,我已经尝试了很长一段时间了,但是我的数组保持不变 这里我的数组是TC\u p\u value,我试图模拟的函数是TC\u stats。如果我们正常运行,代码运行良好,但模拟时间太长(大约一个小时)。因此,为了减少处理时间,我将原始阵列(1000x100)分成10组100x100。虽然代码运行时没有错误,但我总是以某种方式获得相同的数组(与最初定义的数组相同)。我试图将TC\u p\u value定义为global,这样每次运行都可以将值分配给数组的特定部分。然而,这里似乎我做错了什么(因为在多个

我已经尝试了很长一段时间了,但是我的数组保持不变

这里我的数组是
TC\u p\u value
,我试图模拟的函数是
TC\u stats
。如果我们正常运行,代码运行良好,但模拟时间太长(大约一个小时)。因此,为了减少处理时间,我将原始阵列(1000x100)分成10组100x100。虽然代码运行时没有错误,但我总是以某种方式获得相同的数组(与最初定义的数组相同)。我试图将
TC\u p\u value
定义为
global
,这样每次运行都可以将值分配给数组的特定部分。然而,这里似乎我做错了什么(因为在多个处理器上模拟单个阵列是不可能的),或者我的编码逻辑有什么问题吗

非常感谢您的帮助。 下面编写了相同的代码

import pingouin as pg # A package to do regression
TC_p_value = np.zeros((Treecover.shape[1],Treecover.shape[2])) #let this array be of size 1000 x 100

def TC_stats(grid_start):
    global TC_p_value
    for lat in tqdm(range(grid_start, grid_start+100)):
        for lon in range(Treecover.shape[2]):
            TC_p_value[lat,lon] = pg.corr(y=Treecover[:, lat,lon].values,
                                  x=np.arange(1,16,1))['p-val'].values[0]

#Multiprocessing starts here
from multiprocessing import Pool
if __name__ == '__main__':
    pool = Pool()
    grid = np.arange(0,1000,100) #Running it in a group of 100, 10 times
    pool.map(TC_stats, grid)
    pool.close()
    pool.join()

问题是全局定义的数组不能在进程之间共享。因此,您需要使用共享内存

导入ctypes
将numpy作为np导入
导入pingouin作为pg#包进行回归
N、 M=树覆盖形状[1],树覆盖形状[2]
mp_arr=mp.数组(ctypes.c_double,N*M)
TC_p_value=np.frombuffer(mp_arr.get_obj())
TC_p_值=TC_p_值。重塑((N,M))
#让此阵列的大小为1000 x 100
def TC_统计数据(网格_启动):
TC_p_value=np.frombuffer(mp_arr.get_obj())
TC_p_值=TC_p_值。重塑((N,M))
对于tqdm中的lat(范围(网格开始,网格开始+100)):
对于范围内的lon(Treecover.形状[2]):
TC_p_值[lat,lon]=pg.corr(y=Treecover[:,lat,lon]。值,
x=np.arange(1,16,1))['p-val'].值[0]
def init(共享阵列):
全球mp_arr
mp\u arr=共享\u arr_
#多处理从这里开始
来自多处理导入池
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
pool=pool(初始值设定项=init,initargs=(mp_arr,)
grid=np.arange(01000100)#一组运行100次,10次
pool.map\u异步(TC\u统计,网格)
pool.close()
pool.join()
我用一些修改过的玩具示例运行了上面的代码,它成功了


参考资料:

您所说的“空数组”到底是什么意思?形状怎么样?或者仅仅是
TC_p_value
的值保持不变(0)在处理
numpy
数组时,“空”是一个模糊的术语。@hpaulj感谢您指出它。空数组将是一个错误的术语。您猜测的是正确的,它仍然是一个不变的“零”数组。我会改正的。