我写,我想有运行得一个自定义的功能,如果其中一个numpy的功能,不得不采取在一个阵列,并执行相同的操作输入列表中的每个元素上的能力,并返回相同形状的列表所有的结果。
幸运的是,有一个解决方案:numpy.vectorize()
所以我用的是:我有一个创建一个正弦波形式模型的功能,它需要在两个变量:一个numpy的列表X
包含正弦函数的一些输入值,和一个numpy的列表param
包含四个一个正弦曲线可以有可能的参数。
import numpy as np
def sine(X, param):
#Unpacking param
A = param[0]
P = param[1]
Phi = param[2]
B = param[3]
#translating variables
#Phi = t0/P
f = X/P
Y = A*np.sin(2*np.pi*(f + Phi)) + B
return Y
因为只有输入值X
需要的广播,而所有的参数是必需的所有的时间,所以,根据该文档,以vecorise功能的方式如下:
np_sine = np.vectorize(sine, excluded=['param']) #makes sine() behave like a numpy function
......让param
正确矢量化,从排除。
此方法非常有用,因为我将使用此模型拟合到数据集,这就需要偶尔调整参数,同时,用这种方法,我需要它只有一个长行的代码:
CHIsqrt = np.sum(((ydata - np_sine(xdata, param))/yerr)**2)
其中ydata
,xdata
和yerr
的数据点,并在那里的同样长的名单param
是四个参数列表。
然而,结果却是一个错误广播:
File "C:\Users\Anonymous\AppData\Local\Programs\Python\Python36\lib\site-packages\numpy\lib\function_base.py", line 2831, in _vectorize_call outputs = ufunc(*inputs)
ValueError: operands could not be broadcast together with shapes (500,) (4,)
由于名单param
是4个元素长,我得到这个函数忽略我的命令,从矢量化中排除。这是一个问题。
我试图指定的最终结果应该是一个ndArray,这并没有改变错误。
np_sine = np.vectorize(sine, excluded=['param'], otypes=[np.ndarray])
什么是使用此功能的正确方法是什么?
您指定excluded
错误。
In [270]: def foo(x, param):
...: a,b,c = param
...: return a*x
...:
In [271]: f = np.vectorize(foo, excluded=[1]) # specify by position
In [272]: f(np.arange(4),[1,3,2])
Out[272]: array([0, 1, 2, 3])
对于关键字ARG:
In [277]: def foo(x, param=[0,0,0]):
...: a,b,c = param
...: return a*x
...:
In [278]: f = np.vectorize(foo, excluded=['param'])
In [279]: f(np.arange(4),param=[1,3,2])
Out[279]: array([0, 1, 2, 3])