2016-10-11 62 views
1

我有一個索引列表(list(int))和一個求和索引列表(list(list(int))。給定一個二維numpy數組,我需要找到索引之和每列的第二個列表,在第一列將它們添加到相應的指數有什麼辦法向量化這個 這是正常碼:Numpy向量化總和索引

indices = [1,0,2] 
summing_indices = [[5,6,7],[6,7,8],[4,5]] 
matrix = np.arange(9*3).reshape((9,3)) 
for c,i in enumerate(indices): 
    matrix[i,c] = matrix[summing_indices[i],c].sum()+matrix[i,c] 

回答

2

下面是一個使用np.add.reduceat幾乎*量化方法 -

lens = np.array(map(len,summing_indices)) 
col = np.repeat(indices,lens) 
row = np.concatenate(summing_indices) 
vals = matrix[row,col] 
addvals = np.add.reduceat(vals,np.append(0,lens.cumsum()[:-1])) 
matrix[indices,np.arange(len(indices))] += addvals[indices.argsort()] 

請注意,這有一些設置因爲我們沿着列迭代,所以它最適合於具有許多列的輸入數組。

*:幾乎是因爲在開始時使用了map(),但計算結果應該可以忽略不計。

+0

它給了我錯誤: TypeError:根據第二行上的規則'safe' ,無法將數組數據從dtype('O')轉換爲dtype('int64')。 您的意思是寫 lens = np.array(list(map(len(summing_indices))) ? – Aditya369

+0

@ Aditya369嘗試:'lens = np.array(map(len,summing_indices))。astype(int) – Divakar

+0

它給了我 TypeError:int()參數必須是字符串,類似字節的對象或數字,而不是'map' – Aditya369