2015-10-13 84 views
3

我知道如何执行joblib中的并行循环,该循环返回一个列表作为结果。使用索引列表有效填充NumPy数组

但是,是否可以并行填充预定义的numpy矩阵?

想象一下下面的小例子,矩阵和数据:

column_data = ['a', 'b', 'c', 'd', 'e', 'f', 'x'] 
data = [['a', 'b', 'c'], 
     ['d', 'c'], 
     ['e', 'f', 'd', 'x']] 
x = np.zeros((len(data), len(column_data)) 

注意column_data排序和独特的。 data是列表的列表,而不是矩形矩阵。

循环:

for row in range(len(data)): 
    for column in data[row]: 
     x[row][column_data.index(column)] = 1 

有可能parallellise这个循环?填充70,000 x 10,000矩阵非常缓慢而没有并行化。

回答

3

下面是一个几乎量化的方法 -

lens = [len(item) for item in data]  
A = np.concatenate((column_data,np.concatenate(data))) 
_,idx = np.unique(A,return_inverse=True) 

R = np.repeat(np.arange(len(lens)),lens) 
C = idx[len(column_data):] 

out = np.zeros((len(data), len(column_data)))  
out[R,C] = 1 

这里的另一个 -

lens = [len(item) for item in data] 
R = np.repeat(np.arange(len(lens)),lens) 
C = np.searchsorted(column_data,np.concatenate(data)) 

out = np.zeros((len(data), len(column_data))) 
out[R,C] = 1 
+0

我很抱歉造成这种ambiguation。我改进了我的问题。数据不是方阵,而是列表。 'column_data'是排序和唯一的。 – Tim

+0

@Tim请检查编辑好的代码。 – Divakar

+0

我终于明白了你的旧代码,看到你编辑它只有4行:)。让我看看我能否弄清楚这是干什么的。令人敬畏的技术顺便说一句,这是疯狂的快。 – Tim