2015-10-13 83 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