在 NumPy 数组的每一行(逐行)上应用函数



所以,我有函数-

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 的函数(。

感谢您的帮助!

您可以使用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)

有几种方法可以实现此目的,唯一需要更改的行是分配xy。 仅当vector的第一维长度为 2 时,x,y = vector才有效。(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

只需选择您最喜欢的一种,可能还有其他方法(我几乎可以肯定,但我想这就足够了(。最后一个是迄今为止最快的,其他的可以比较。然而,最后一个的缺点是,在更高的维度上使用它并不容易。

相关内容

最新更新