Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求整数布尔索引的和_Python_Arrays_Numpy - Fatal编程技术网

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.])