总结Numpy布尔指数

时间:2017-09-08 16:10:40

标签: python arrays numpy

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

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循环。

感谢。

2 个答案:

答案 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用于选择索引。