Python 求整数布尔索引的和
我试图找到一种基于布尔索引的值数组求和的方法,使用模函数来确定月的开始/结束Python 求整数布尔索引的和,python,arrays,numpy,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 re
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.sum(vals[np.where(months%12==0)[0]])
可能吗
np。其中
用于选择索引。似乎您需要:
说明: 1) 。使用模运算找出总和应以
(月-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(不包括),以此类推:
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:])]
并提供您所需的输出。给了您一个向上投票的机会,但我只有不到15个代表,所以它没有显示出来。这很有效。你能解释一下吗?不知道reduce是如何工作的,也没有找到flatnonzero的清晰解释。非常好的解释,谢谢。您是否从月份中减去1,因为flatnonzero使用基于0的索引,而不是我尝试使用的每月索引?主要是因为它需要开始索引,所以它的add.reduceat
才能正常工作。因此,months%12==0
正如您所做的那样给出了段结束的索引,而(months-1)%12==0
移动并给出了段开始的索引。我不完全确定上面的代码是否涵盖了您的所有用例,您可能需要进行相应的调整。
(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)
np.flatnonzero((months - 1) % 12 == 0)
array([ 0, 12, 24])
np.add.reduceat(vals, [0, 12, 24])
# array([ 12., 24., 36.])