Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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 如何编写只计算类数组对象的前n项并返回其和的函数?_Python_Numpy - Fatal编程技术网

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

Python 如何编写只计算类数组对象的前n项并返回其和的函数?,python,numpy,Python,Numpy,假设我有一个数组,如下所示: A = np.array([a,b,c,d,e,f]) 数组中的每个元素都有一个等于标量的值(例如,a可能等于2,b可能等于7,等等)。但是a和b的计算需要很长的时间,因此Python可能需要几分钟来确定a的值,还要几分钟来确定b的值,对于其余的元素也是如此 是否有一种方法可以定义一个函数(我们称之为sumfirstn)来计算a的前n项并计算它们的和?例如,sumfirstn(A,2)将返回A+b,sumfirstn(A,3)将返回A+b+c,等等 但是(这很重要

假设我有一个数组,如下所示:

A = np.array([a,b,c,d,e,f])
数组中的每个元素都有一个等于标量的值(例如,
a
可能等于2,
b
可能等于7,等等)。但是
a
b
的计算需要很长的时间,因此Python可能需要几分钟来确定
a
的值,还要几分钟来确定
b
的值,对于其余的元素也是如此

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

但是(这很重要)
sumfirstn(A,2)
不能评估
c
d
e
f
。它必须只评估正在添加的相关项(以减少计算时间)。当然,
A[0:n].sum()可以做到这一点,但这需要Python计算整个数组
A
,我不想这样做


有什么想法吗
A
不必是数组,也可以是列表、数据帧或其他形式。。。只要是可行的。

假设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)

看起来您需要一个通用的解决方案来对任何iterable的第一个
n
项求和,这不一定要支持索引、切片或
sum
方法

如果我理解正确的话,作为一个通用解决方案,以下内容就足够了

>>> from itertools import islice
>>> 
>>> def first_n_sum(iterable, n):
...     return sum(islice(iterable, n))
演示:


请注意,如果iterable不能生成
n
值,则不会出现错误,就像在数组长度之外进行切片一样。在本例中,将返回所有元素的总和。

我对您的术语和此处的“评估”有点混淆。我认为你没有标量数组,否则这里就没有问题了。所以我不确定你有什么。你问这个问题的方式是让它看起来像是
数组A
实际上并不存在,你只想在它们完成之前的一些计算时求和
A,b,c,d,…n
,但是之前计算的输出是某种数组。我说得对吗?如果不是这样,为什么评估a、b、c需要很长时间?是的,没错。这种情况很难解释。数组实际上并不存在。我有很多表达式,想计算前n个表达式的和。每个表达式返回一个常量。由于我正在迭代“n”的各种数字,因此需要一种相对快速的方法。您能否更清楚地解释
a[0:n].sum()的问题是什么?“但是这需要Python计算整个数组
A
”@MathewCarroll什么样的表达式?在我的回答中,我将其用作函数。但是如果使用eval()也可以是代码,谢谢。正如您在注释中指出的,当a、b、c、d、e、f是代码而不是函数时,eval()将起作用。你认为这会解决这个问题吗
>>> 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