如何解决广播与numpy.vectorize问题()

问题描述 投票:1回答:1

我写,我想有运行得一个自定义的功能,如果其中一个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)

其中ydataxdatayerr的数据点,并在那里的同样长的名单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])

什么是使用此功能的正确方法是什么?

python numpy vectorization numpy-broadcasting
1个回答
1
投票

您指定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])
© www.soinside.com 2019 - 2024. All rights reserved.