首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对NumPy数组的每一行(逐行)应用函数

对NumPy数组的每一行(逐行)应用函数
EN

Stack Overflow用户
提问于 2017-08-10 12:46:42
回答 2查看 60.5K关注 0票数 39

所以,我有一个函数-

代码语言:javascript
运行
复制
def function(x):
    x , y = vector
    return exp(((-x**2/200))-0.5*(y+0.05*(x**2) - 100*0.05)**2)

假设我想在以下几点评估它(第一列是x值,第二列是y值)-

代码语言:javascript
运行
复制
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个值组成的数组)。

例如,如果函数是一个二元正态分布-

代码语言:javascript
运行
复制
def function2(x):

function2 = (mvnorm.pdf(x,[0,0],[[1,0],[0,1]]))

return function2

我把上面的值传递给这个函数,我会得到-

代码语言:javascript
运行
复制
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的函数)。

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-10 12:49:29

您可以使用

代码语言:javascript
运行
复制
np.apply_along_axis(function, 1, array)

第一个参数是函数,第二个参数是要应用函数的轴。在您的示例中,它是第一个轴。当然,最后一个参数是数组。

但是,应该提醒您,apply_along_axis只是一个方便的函数,而不是灵丹妙药。它有一个严重的速度限制,因为它只隐藏了一个循环。在可能的情况下,您应该始终尝试向量化您的计算。我是这样做的:

代码语言:javascript
运行
复制
v = array[:, 0] ** 2   # computing just once  
return np.exp((-v / 200) - 0.5 * (array[:, 1] + 0.05 * v - 5) ** 2)
票数 64
EN

Stack Overflow用户

发布于 2017-08-10 14:48:46

有几种方法可以实现这一点,唯一需要更改的代码行是指定xy。仅当vector的第一个维度的长度为2. (vector.shape = 2,...)时,x,y = vector才有效。因此,您可以使用以下任意命令更改向量:

代码语言:javascript
运行
复制
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

只要选择你最喜欢的,可能还有其他方法(我几乎可以肯定,但我想这就足够了)。到目前为止,最后一个是最快的,其他的都是可比的。然而,最后一个的缺点是,在更高的维度上使用它并不那么容易。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45604688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档