对于数组中的每个单元格应用相同的函数,Numpy函数是否更好?

2024-06-09 01:43:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用值迭代来解决网格世界问题。网格是一个二维阵列,几乎没有墙和终端阶段。我需要对数组中的每个单元格应用值迭代。值迭代所做的是,为每个单元格计算一个效用值。 基本上,我需要计算每个单元格的效用,我需要重复迭代,直到每个单元格的效用停滞。效用值由以下公式给出:U'(s)=max(R(s)+总和(T(s,a,s')*U(s')) 因此,如果我们在[0,0]单元,我们可以向四个方向移动:上,下,左,右。如果我们撞到一堵墙,我们就不会移动出s'=s,因此U(s')=U(s)(例如,如果我们尝试从[0,0]向上移动,我们就保持在相同的位置,即相同的状态s)。 另一方面,如果我们试着从[0,0]向右移动,我们就可以自由地向那个方向移动,从而达到状态S'=[0,1]。 类似地,我们计算每个动作的值,我们对单元格的新实用程序将成为获得的最大值。 我如何在numpy中编写这样一个函数,这样我就可以编写一个将该函数应用到每个单元格的数组,并为每个单元格创建一个具有新实用程序值的新数组。而且,当所有效用值都停滞时,我需要停止。 PS:我试着像这篇文章Efficient evaluation of a function at every cell of a NumPy array中描述的那样对函数进行矢量化

但是,我正在寻找某种方法,可以通过索引而不是值来访问单元格。这是因为,对于每个细胞,我需要检查它是一堵墙还是一个终端阶段。如果是终端阶段,我需要跳过计算该单元格的效用值。同样,对于墙单元,我需要跳过计算该单元的实用程序,因为代理永远无法到达该单元。你知道吗

请注意:我尝试使用python列表进行计算,但是要计算1000000个单元格需要花费大量时间。因此,我想使用numpy,但我不精通numpy。你知道吗

另外,为了更好地了解网格世界问题,您可以查看以下图片:https://image.slidesharecdn.com/luciomarcenarotuesummerschool-130913100859-phpapp01/95/lucio-marcenaro-tue-summerschool-39-638.jpg?cb=1379067018


Tags: of函数实用程序numpy终端网格状态世界