我想将矢量输入到我关联的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.
答案 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])