我正在尝试找到一种基于布尔索引对值数组求和的方法,使用模数函数来确定月份开始/结束。
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()函数只是对整个事物求和,但是积累了整个事物,这不是我想要的。目标结果包含在上面 - 这是一种常见的电子表格摘要技术,通常使用SUMIF函数根据某些参数对值进行求和。
有一种简单的方法吗?我确定有,我只是错过了它,我已经花了一点时间试图得到这个数字 - 我宁愿不使用for循环。
感谢。
答案 0 :(得分:2)
似乎你需要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)。使用modulo找出总和应该由(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:])]
并提供您需要的输出。
答案 1 :(得分:1)
np.sum(vals[np.where(months % 12 == 0)[0]])
也许?
np.where
用于选择索引。