我正在尝试找到一种使用布尔函数来确定月份开始/结束时间的基于布尔索引的求和值数组的方法。
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.flatnonzero
与np.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/