使用numpy向量化相关的勒让德多项式

时间:2016-04-18 09:46:22

标签: python numpy

我想将矢量输入到我关联的legendre polynom。

import scipy.special as sp
def f(m,n,x):
    return sp.lpmn(m,n,x)[0][-1,-1]
x=[1,2,3]
print f(1,1,x)

输出

ValueError: z must be scalar.

如何将矢量输入到相关的legendre多项式,例如拟合和绘图?使用numpy对函数进行矢量化不起作用:

np.vectorize(f(1,1,x))

>>>> File "C:\Anaconda\lib\site-packages\scipy\special\basic.py", line 681, in lpmn
raise ValueError("z must be scalar.")

>>>> ValueError: z must be scalar.

1 个答案:

答案 0 :(得分:0)

numpy.vectorize将一个函数作为第一个参数,并返回一个包装原始函数的新函数。当像这样调用时:

np.vectorize(f(1,1,x))

它实际上意味着“使用参数1,1和x调用函数f,将结果作为第一个参数传递给np.vectorize”。你应该做的是装饰你的功能:

@np.vectorize
def f(m, n, x):
    return sp.lpmn(m, n, x)[0][-1, -1]

测试:

In [4]: f(1, 1, [1, 2, 3])
/usr/lib/python3/dist-packages/numpy/lib/function_base.py:1639: RuntimeWarning: overflow encountered in ? (vectorized)
  outputs = ufunc(*inputs)
Out[4]: array([ 0.        ,  1.73205081,  2.82842712])

当像这样使用时,你必须小心不要将数组值作为顺序和程度传递给f m n ),因为它们将也是矢量化,可能会失败,或做出意想不到的事情:

In [6]: f([1, 2], 1, [1, 2, 3])
 ...
ValueError: operands could not be broadcast together with shapes (2,) () (3,) 
可以通过传递一组位置参数索引和关键字参数名称来告诉

numpy.vectorize不要考虑这些参数:

def f(m, n, x):
    return sp.lpmn(m, n, x)[0][-1, -1]
f = np.vectorize(f, excluded={0, 1}, otypes=[np.float64])