我有两个numpy数组prods
和index
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
时返回累积和,并将累积和值重置为零。
答案 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
。如果您不想使用Fraction
或Decimal
,那么您无能为力。
你也可以在这里使用np.add.reduceat
:
>>> np.add.reduceat(prods, np.append([0], (np.where(index)[0]+1)[:-1]))
array([ 0.75, 1.98, 5.1 ])