如何编写仅计算数组对象的前n个项并返回其和的函数?

时间:2018-10-23 15:29:51

标签: python numpy

假设我有一个如下数组:

A = np.array([a,b,c,d,e,f])

数组中的每个元素的值都等于标量(例如,a等于2,b等于7,依此类推)。但是ab需要花费很长时间才能评估,因此Python可能需要花费几分钟才能确定值a,需要花费几分钟才能确定{{ 1}},其余元素也是如此。

是否有一种方法可以定义一个计算b的前n个项并计算其总和的函数(简称为sumfirstn)?例如,A将返回sumfirstn(A,2)a+b将返回sumfirstn(A,3),等等。

但是(这很重要)a+b+c必须评估sumfirstn(A,2)cde。它只能 评估要添加的相关术语(以减少计算时间)。当然,f可以解决问题,但这需要Python计算整个数组A[0:n].sum(),我不想这么做!

有什么想法吗? A不必是数组,也可以不是列表,数据框或其他某种形式……无论如何。

2 个答案:

答案 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)