簡體   English   中英

在 NumPy 數組的每一行(逐行)上應用函數

[英]Apply function on each row (row-wise) of a NumPy array

所以,我有這個功能——

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的分配。 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

只需選擇您最喜歡的一種,可能還有其他方式(我幾乎可以肯定,但我想這已經足夠了)。 最后一個是迄今為止最快的,其他的都差不多。 然而,最后一個的缺點是,在更高維度上使用它並不容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM