取一个基于布尔数组的numpy数组的总和

时间:2017-08-11 11:29:13

标签: python numpy

我有两个numpy数组prodsindex

prods = np.asarray([ 0.5 ,  0.25,  1.98,  2.4 ,  2.1 ,  0.6 ])
index = np.asarray([False,  True,  True, False, False,  True], dtype=bool)

我需要使用prods数组计算index数组中值的总和。我想要的输出是

res = [0.75, 1.98, 5.1]

True数组中的第一个index前面有一个False,所以我从prods(。5,.25)中取出前两个元素并求它们达(0.75)。索引中的第二个True前面没有False(因为它前面有一个True,位置零的False不算数,所以我只输出在这种情况下1.98。第三个True前面有两个False,因此我从prods数组(2.4,2.1,0.6)中获取这些值并将它们相加。关于如何做到这一点的任何想法?

我基本上需要类似np.cumsum的东西,但我需要在每次索引中出现True时返回累积和,并将累积和值重置为零。

1 个答案:

答案 0 :(得分:3)

您可以使用np.split并使用index数组的np.where作为分割位置:

>>> [arr.sum() for arr in np.split(prods, np.where(index)[0]+1)[:-1]]
[0.75, 1.98, 5.0999999999999996]

由于浮点精度,最后一个不是5.1。如果您不想使用FractionDecimal,那么您无能为力。

你也可以在这里使用np.add.reduceat

>>> np.add.reduceat(prods, np.append([0], (np.where(index)[0]+1)[:-1]))
array([ 0.75,  1.98,  5.1 ])