我正在尝试找到一种使用布尔函数来确定月份开始/结束时间的基于布尔索引的求和值数组的方法。

months = np.arange(36) + 1 # +1 to denote months rather than index
vals = np.ones(36)
vals[12:24] = 2
vals[24:36] = 3

# closest try:

vals.cumsum()[[months % 12 == 0]] # returns array([12, 36, 72])

# target result = array([12, 24, 36])


vals.sum()函数只是对整个对象求和,但是cumsum会对整个对象进行累加,这与我要查找的内容不完全相同。目标结果包括在上面-这是一种常见的电子表格汇总技术,通常可以使用SUMIF函数根据某些参数对值求和。

是否有捷径可寻?我敢肯定有,我只是想念它,我花了一些时间试图弄清楚这个数字-不希望不使用for循环。

谢谢。

最佳答案

似乎您需要np.add.reduceat

np.add.reduceat(vals, np.flatnonzero((months - 1) % 12 == 0))
# array([ 12.,  24.,  36.])




说明:

months
# array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
#        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
#        35, 36])


1)。使用取模以(months - 1) % 12找出总和的条件:

(months - 1) % 12 == 0
# array([ True, False, False, False, False, False, False, False, False,
#        False, False, False,  True, False, False, False, False, False,
#        False, False, False, False, False, False,  True, False, False,
#        False, False, False, False, False, False, False, False, False], dtype=bool)


2)。 np.flatnonzeronp.where相似,并给出索引,因此在这里,第一个和从0到12(不包括)开始,依此类推:

np.flatnonzero((months - 1) % 12 == 0)
array([ 0, 12, 24])


3)。找出索引后,使用np.add.reduceat汇总各段:

np.add.reduceat(vals, [0, 12, 24])
# array([ 12.,  24.,  36.])


本质上,这等效于[sum(vals[0:12]), sum(vals[12:24]), sum(vals[24:])]并提供所需的输出。

关于python - 汇总Numpy bool 指数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46120633/

10-09 20:35
查看更多