2016-10-11 63 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