2014-10-31 60 views
1

在Python 2.7有大numpy矩阵字典,与基体的名称键入:返回地图结果密钥字典

import multiprocessing as mp 
import numpy as np 
names = ['A', 'B', 'C'] 
size = 40 
matrices = {k:np.random.random([size,size]) for k in names} 

我想运行在每个矩阵一些矩阵代数,使用multiprocessing图书馆Pool.map其中,根据机制的文档,是正常的Python map的并联等效(所以如果我能做到这一点与内置的地图,我也许可以用Pool.map做到这一点...)

def hard_maths(matrix): 
    return np.dot(np.linalg.inv(matrix), 
      matrix).round(0) 

pool = mp.Pool() 
results = pool.map(hard_maths, matrices.itervalues()) 
pool.close() 
pool.join() 

这使我的结果成为list

但我怎么能说哪个矩阵(ABC)产生了哪个结果呢?在理想的世界中,results最终会以与matrices相同的键为键位并以值作为结果。

注意:我不希望每次都将整个matrices列表传递给该函数,因为这会造成大量数据开销,从而影响多处理的效果。

回答

1

只是通过名称与值,然后返回两个:

def hard_maths(name_matrix): 
    name, matrix = name_matrix 
    return name, np.dot(np.linalg.inv(matrix), 
      matrix).round(0) 

pool = mp.Pool() 
results = pool.map(hard_maths, matrices.iteritems()) 
pool.close() 
pool.join() 

在Linux上,多是通过派生实现。只要在子进程空间中创建池时存在与基体,其已经和你可以刚好路过名

def hard_maths(name): 
    return name, np.dot(np.linalg.inv(matricies[name]), 
      matrix).round(0) 

pool = mp.Pool() 
results = pool.map(hard_maths, matrices.iterkeys()) 
pool.close() 
pool.join() 
+1

我认为你需要为工作一个星图减少开销?尽管可以在函数中将该区段解压缩到名称和矩阵中。也作为一个猜测,'dict(pool.map(hard_maths,matrices.iteritems()))'会把它变成一个键控字典。 – GP89 2014-10-31 15:57:58

+0

你不能像这样使用'map'。你需要使用'starmap',如果使用Python 3.3+,或者执行'def hard_maths(name_matrix):name,matrix = name_matrix' – dano 2014-10-31 15:58:11

+0

@ GP89 ​​ - 你是对的。修复。 – tdelaney 2014-10-31 16:00:29