python中的级数和

python中的级数和,python,numpy,Python,Numpy,python中是否有内置函数,numpy或它的某个库可以获得如下系列的总和: list1 = [2,3,4] list2 = [3,3,3] Total = sum (i * j for i in list1 and j in list2 ) 其中x和y是列表,L是x或y的长度 最后,如果没有内置函数,我尝试了另一种代码,如: Total = sum ((i for i in list1) * (j for j in list2)) 当然,它不起作用,但我需要靠近那个或靠近这个的东西:

python中是否有内置函数,numpy或它的某个库可以获得如下系列的总和:

list1 = [2,3,4]
list2 = [3,3,3]
Total = sum (i * j for i in list1 and j in list2 )

其中x和y是列表,L是x或y的长度

最后,如果没有内置函数,我尝试了另一种代码,如:

Total = sum ((i for i in list1) * (j for j in list2))
当然,它不起作用,但我需要靠近那个或靠近这个的东西:

list1 = [2,3,4]
list2 = [3,3,3]
Total = sum (i * j for i in list1 and j in list2 )
注:我可以建立我自己的功能来做到这一点,但我正在寻找一个简单,快速或内置的一个,所以请不要给我你自己的功能

编辑:我希望通用表单能够做到这一点,这样当系列中有例如
Log(n)
或其他类型的数学时,我可以使用此表单


这实际上只是一个点积:

result = numpy.dot(list1, list2)
请注意,如果使用NumPy,则不应使用列表来表示矩阵和向量。NumPy数组在这方面效率更高,也更方便。

对于内置,您可以使用它将位于同一索引位置的元素组合在一起

list1 = [2,3,4]
list2 = [3,3,3]
result = sum( x*y for x,y in zip(list1, list2) )
关于编辑

内置版本将是

from math import log
result = sum( log(i)*y for i,y in enumerate(list1,1) )
一个更广义的版本是

from math import log
result = sum( log(i)*y for i,y in enumerate(list1,1) )

如果你可以为它的任何部分提供你喜欢的任何功能,那么第一个就是

result = dotproduct(list1,list2)
第二个可能是

result = dotproduct(range(1,len(list1)+1),list1, mul=lambda i,x:log(i)*x )
#                        ^ the i                    ^ how to operate

关键是你要相应地计算第二个向量

使用numpy更容易

import numpy as np
logi = np.log(np.arange(1,len(list1)+1)
result = np.dot(logi,list1)
这再次归结为相应地计算零件


您还可以使它不接收2个向量/列表,而只接收一个向量/列表,并接收在元素及其索引中工作的函数

并将其用作

result = sum_serie( list1, lambda i,x:log(i)*x, 1)

从评论来看,如果我做对了,那么像这样的事情

from itertools import islice
def sum_serie(vect, *slice_arg, fun = lambda x:x): #with that fun, is like the regular sum
    """sum_serie(vect, [start,]stop[,step], fun = lambda x:x)"""
    if not slice_arg:
        slice_arg = (0,None,None)
    return sum( fun(x) for x in islice(vect, *slice_arg) )
还是像以前一样列举

from itertools import islice
def sum_serie_i(vect, *slice_arg, fun = lambda i,x:x): #with that fun, is like the regular sum
    if not slice_arg:
        slice_arg = (0,None,None)
    return sum( fun(i,x) for i,x in islice(enumerate(vect), *slice_arg) )
并使用,例如

sum_serie( x, 0, 100, 2, fun=lambda xi: c*xi) #for arbitrary constant c
sum_serie_i( x, 0, 100, 2, fun=lambda i,xi: log(i)*xi)
注意:这样它接受serie/iterable/whatever,最多3个位置参数,其含义与range中的相同

注2:这对于PY3来说是一个有趣的纯关键字参数,在Python2中,同样的效果是通过

def sum_serie_i(vect, *slice_arg, **kargv): 
    fun = kargv.get('fun', lambda i,x:x) #with that fun, is like the regular sum
    if not slice_arg:
        slice_arg = (0,None,None)
    return sum( fun(i,x) for i,x in islice(enumerate(vect), *slice_arg) )

numpy数组的数学运算符执行元素操作,因此您可以使用:

import numpy as np
np.sum(np.multiply(list1, list2))
# or np.sum(list1 * list2)  if any of list1/list2 is a numpy array
或在第二种情况下:

logi = np.log(np.arange(1, len(x)))  # or np.log10, not sure which one you mean
np.sum(np.multiply(logi, x[1:]))
如前所述,
np.sum(np.multiply())
只是一个点积,因此您也可以使用
@
(至少对于python 3.5+,否则使用
np.dot
):


使用
*
运算符并沿
0
th轴求和

In [48]: a
Out[48]: array([0, 1, 2, 3, 4])

In [49]: b
Out[49]: array([5, 6, 7, 8, 9])

In [50]: a*b
Out[50]: array([ 0,  6, 14, 24, 36])

In [51]: np.sum(a*b, axis=0)
Out[51]: 80

但是,您真的应该使用更酷、更快的
np.inner()


这些都做同样的事情

np.einsum('i,i', list1, list2)
np.inner(list1, list2)
np.dot(list1, list2)

np.einsum('i,i', list1, list2)
np.inner(list1, list2)
np.dot(list1, list2)

np.einsum('i,i', list1, list2)
np.inner(list1, list2)
np.dot(list1, list2)
所有产量
27

对于更大的阵列,
np.einsum
开始看到性能提升


但如果它们不是系列中的列表,该怎么办?如果系列中包含日志(n),我们可以应用您的解决方案或任何其他解决方案来执行此操作。有做级数和的一般形式吗@穆罕默德·沃尼:不清楚你在问什么。你所说的“包含日志(n)”是什么意思?你认为这个系列将如何表现?通常,您可以对数组使用
numpy.sum
进行求和,也可以对iterables使用内置的
sum
进行求和,只要您可以将序列表示为数组或iterable。@croperfield:案例一的答案与案例二不同。等等,如果我改变了系列中的元素,增加了它们的数量,或者改变了系列的条件,我必须适应它,并为它制定一个私有的解决方案(函数)。为了进一步澄清:没有公式我可以给它系列的元素和条件作为参数,比如:sum_系列(x[n],log(n),n,0100,2),其中x是一个系列或任何东西,n是迭代数,0是n的初始值,100是n的最终值,2是n每次的增量。