编程语言
首页 > 编程语言> > python – Numpy:如何向量化应用于数据集的函数的函数形式的参数

python – Numpy:如何向量化应用于数据集的函数的函数形式的参数

作者:互联网

最后,我想删除下面代码中的所有显式循环,以利用C中的numpy向量化和函数调用而不是python.

下面简化了python中numpy的使用.
我有以下二次函数:

def quadratic_func(a,b,c,x):
    return a*x*x + b*x + c

我正在尝试优化a,b,c给定输入数据x和相同大小的输出数据y的选择(当然,这应该通过线性回归来完成……但是幽默我).说len(x)= 100.使用标量a,b,c轻松进行矢量化以获得长度为100的结果.

假设我们知道a,b,c应该在[-10,10]之内,并且我通过构建网格并选择具有最小和平方误差的点进行优化.

a=np.arange(-10.0, 10.01, 2.0)
nodes=np.array(np.meshgrid(a,a,a)).T.reshape(-1,3) #3-d cartesian product with array of nodes

对于1331个节点中的每一个,我想计算长度为100的返回值的所有1331.

res=[]
x=np.random.uniform(-5.0,5.0, 100)
for node in nodes:
    res.append(quadratic_func(*node, x=x))

我怎样才能利用广播来获取1331个项目的列表,每个项目都有100个值,这些值是在x上调用quadratic_func的结果?答案必须使用矢量化,广播等来获得我正在寻找的数量级的速度改进.此外,答案必须使用对quadratic_func的调用 – 或者更常见的是my_func(* node,x = x).

在现实生活中,我正在优化非线性函数,该函数甚至不接近凸,并且具有许多局部最小值.如果我可以达到“正确”的本地最小值,这是一个很好的功能形式 – 我已经知道如何做到这一点,但希望更快到达那里!

解决方法:

使用broadcastingnp.einsum组合的一种方法 –

np.einsum('ij,jk->ik',nodes,x**np.array([2,1,0])[:,None])

另一个使用矩阵乘法与np.dot

nodes.dot(x**np.array([2,1,0])[:,None])

标签:python,vectorization,numpy,performance,numpy-broadcasting
来源: https://codeday.me/bug/20190706/1393576.html