假设我有一个如下数组:
A = np.array([a,b,c,d,e,f])
数组中的每个元素的值都等于标量(例如,a
等于2,b
等于7,依此类推)。但是a
和b
需要花费很长时间才能评估,因此Python可能需要花费几分钟才能确定值a
,需要花费几分钟才能确定{{ 1}},其余元素也是如此。
是否有一种方法可以定义一个计算b
的前n个项并计算其总和的函数(简称为sumfirstn
)?例如,A
将返回sumfirstn(A,2)
,a+b
将返回sumfirstn(A,3)
,等等。
但是(这很重要)a+b+c
必须不评估sumfirstn(A,2)
,c
,d
和e
。它只能 评估要添加的相关术语(以减少计算时间)。当然,f
可以解决问题,但这需要Python计算整个数组A[0:n].sum()
,我不想这么做!
有什么想法吗? A
不必是数组,也可以不是列表,数据框或其他某种形式……无论如何。
答案 0 :(得分:1)
您似乎需要一个通用的解决方案来汇总可迭代的 any 的前n
个项目,而不必支持索引,切片或sum
方法。
如果我正确理解,以下内容就可以作为通用解决方案。
>>> from itertools import islice
>>>
>>> def first_n_sum(iterable, n):
... return sum(islice(iterable, n))
演示:
>>> first_n_sum([1,2,3,4], 3)
6
>>> first_n_sum((x for x in (1, 2, 3, 4)), 2)
3
>>> first_n_sum([], 123)
0
>>> from collections import OrderedDict
>>> first_n_sum(OrderedDict([(1, 'a'), (2, 'b'), (-3, 'c'), (100, 'd')]), 3)
0
请注意,如果可迭代项不能产生n
值,则不会出错,就像切片超出数组的长度是可以的。在这种情况下,将返回所有元素的总和。
答案 1 :(得分:0)
假设a,b,c,d,e,f是函数,我们可以执行以下操作:
def func():
return 1+2+3
def sumfirstn(arr_of_functions, n):
return sum([arr_of_functions[i]() for i in range(n)])
A = np.array([func, func, func, func, func, func])
sumfirstn(A,2)