Python 计算;“生成函数”;与努比

Python 计算;“生成函数”;与努比,python,numpy,Python,Numpy,在数学中,“生成函数”是由一系列数字定义的,c0,c1,c2,…,cn,由c0+c1*x+c2*x^2++cn*x^n。根据系数的来源,这些函数可分为“矩母函数”、“概率母函数”和各种其他类型 我有一个系数数组,我想要一个快速的方法来创建相应的母函数 import numpy as np import matplotlib.pyplot as plt print f( 0.2 ) x = np.linspace( -5, 5, 51 ) plt.plot( x , f(x) ) 我可以 i

在数学中,“生成函数”是由一系列数字定义的,
c0
c1
c2
,…,
cn
,由
c0+c1*x+c2*x^2++cn*x^n
。根据系数的来源,这些函数可分为“矩母函数”、“概率母函数”和各种其他类型

我有一个系数数组,我想要一个快速的方法来创建相应的母函数

import numpy as np
import matplotlib.pyplot as plt

print f( 0.2 )

x = np.linspace( -5, 5, 51 )
plt.plot( x , f(x) )
我可以

import numpy as np
myArray = np.array([1,2,3,4])
x=0.2
sum([c*x**k for k,c in enumerate myArray])
或者我可以在
k
th条目中有一个数组,其中包含
c[k]
。似乎应该有一个快速的方法来做到这一点

不幸的是,由于“generate”和“function”是编程中的常用词,以及“generating function”的组合,因此我在搜索引擎方面没有任何运气,因此查找这些内容的尝试变得复杂起来

>>> coeffs = np.random.random(5)
>>> coeffs
array([ 0.70632473,  0.75266724,  0.70575037,  0.49293719,  0.66905641])
>>> x = np.random.random()
>>> x
0.7252944971757169
>>> powers = np.arange(0, coeffs.shape[0], 1)
>>> powers
array([0, 1, 2, 3, 4])
>>> result = coeffs * x ** powers
>>> result
array([ 0.70632473,  0.54590541,  0.37126147,  0.18807659,  0.18514853])
>>> np.sum(result)
1.9967167252487628
将每个术语的度数做成一个数组

degrees = np.arange(len(coeffs))
升高
x
每度

terms = np.power(x, degrees)
将系数相乘,求和

result = np.sum(coeffs*terms)

>>> coeffs
array([1, 2, 3, 4])
>>> degrees
array([0, 1, 2, 3])
>>> terms
array([ 1.   ,  0.2  ,  0.04 ,  0.008])
>>> result
1.552
>>>

作为一项功能:

def f(coeffs, x):
    degrees = np.arange(len(coeffs))
    terms = np.power(x, degrees)
    return np.sum(coeffs*terms)

或者仅仅是我们


使用
numpy
s
多项式
类可能是最简单的方法

from numpy.polynomial import Polynomial

coefficients = [1,2,3,4]
f = Polynomial( coefficients )
然后可以像使用任何其他函数一样使用该对象

import numpy as np
import matplotlib.pyplot as plt

print f( 0.2 )

x = np.linspace( -5, 5, 51 )
plt.plot( x , f(x) )

如果您想要性能,也可以建议使用-

np.einsum('i,i->',myArray,x**np.arange(myArray.size))

为什么不搜索“多项式”?你一次只对函数的一个值
x
感兴趣?@JohnColeman问得好-假设这是因为我实际上在处理无限和的截断,所以我没有想到。@wwii说得对。@Joel这可能会让我对
np.einsum
的性能优势有一些见解。不过,在这种情况下,由于您只沿一个轴对元素求和,因此使用
np.sum
的性能优势可能是微不足道的。
np.einsum('i,i->',myArray,x**np.arange(myArray.size))