所以,我有功能 -
def function(x):
x , y = vector
return exp(((-x**2/200))-0.5*(y+0.05*(x**2) - 100*0.05)**2)
让我们说我想在以下几点评估它(第一列是x值,第二列是y值) -
array([[-1.56113514, 4.51759732],
[-2.80261623, 5.068371 ],
[ 0.7792729 , 6.0169462 ],
[-1.35672858, 3.52517478],
[-1.92074891, 5.79966161],
[-2.79340321, 4.73430001],
[-2.79655868, 5.05361163],
[-2.13637747, 5.39255837],
[ 0.17341809, 3.60918261],
[-1.22712921, 4.95327158]])
即。我想传递函数第一行的值并进行求值,然后第二行并计算等等,然后最终结果将是在这些点评估的值的数组(因此,一个由10个值组成的数组)。
因此,例如,如果函数是,例如,双变量正态分布 -
def function2(x):
function2 = (mvnorm.pdf(x,[0,0],[[1,0],[0,1]]))
return function2
我将上述值传递给了这个函数,我会得到 -
array([ 1.17738907e-05, 1.08383957e-04, 1.69855078e-04,
5.64757613e-06, 1.37432346e-05, 1.44032800e-04,
1.33426313e-05, 1.97822328e-06, 6.56121709e-08,
4.67076770e-05])
所以基本上,我正在寻找一种方法来重写函数,以便它可以做到这一点。此外,我想将函数仅作为一个变量的函数(即只是x的函数)。
感谢您的帮助!
答案 0 :(得分:14)
您可以使用np.apply_along_axis
:
np.apply_along_axis(function, 1, array)
第一个参数是函数,第二个参数是要应用函数的轴。在您的情况下,它是第一个轴。当然,最后一个参数是数组。
然而,应该警告你,apply_along_axis
只是一个便利功能,而不是一个神奇的子弹。它具有严格的速度限制,因为它只是隐藏了一个循环。在可能的情况下,您应该始终尝试对计算进行矢量化。以下是我如何做到这一点:
v = array[:, 0] ** 2 # computing just once
return np.exp((-v / 200) - 0.5 * (array[:, 1] + 0.05 * v - 5) ** 2)
答案 1 :(得分:2)
有几种方法可以实现这一目标,您必须更改的唯一方法是x
和y
。 x,y = vector
仅在vector
的第一维长度为2时才有效(vector.shape = 2,...
)。因此,您只需使用以下任一命令更改矢量:
x,y = vector.T #transpose the array
x,y = vector.swapaxes(0,1) #swap the axis 0 and 1
x,y = np.rollaxis(vector,1) #roll the axis 1 to the front
x,y = vector[:,0], vector[:,1] #slice asignement
选择你最喜欢的那个,可能有其他方式(我几乎可以肯定,但我想这就足够了)。最后一个是迄今为止最快的,其他的是可比的。然而,最后一个的缺点是,在更高的维度上使用它并不容易。