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).
在现实生活中,我正在优化非线性函数,该函数甚至不接近凸,并且具有许多局部最小值.如果我可以达到“正确”的本地最小值,这是一个很好的功能形式 – 我已经知道如何做到这一点,但希望更快到达那里!
解决方法:
使用broadcasting
和np.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