Numpy向量化索引求和

3

我有一个索引列表(list(int))和一个求和索引列表(list(list(int)))。给定一个2D 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]
1个回答

3
这里是一种几乎向量化的方法,使用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()]

请注意,这会有一些设置开销,因此最适合迭代列时具有良好列数的2D输入数组。*:几乎是因为在开头使用了map(),但计算上应该可以忽略不计。

它在第二行给了我一个错误: TypeError: 按照规则“safe”,无法将数组数据从dtype('O')转换为dtype('int64') 你是不是想写 lens = np.array(list(map(len(summing_indices)))? - Aditya369
@Aditya369 试试这个:lens = np.array(map(len,summing_indices)).astype(int) - Divakar
它给我返回了TypeError: int() argument must be a string, a bytes-like object or a number, not 'map'。 - Aditya369
我理解你在做什么。 - Aditya369

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接