【问题标题】:For a 2D Matrix, what is the faster way to apply a function to each cell of the matrix in python?对于 2D 矩阵,在 python 中将函数应用于矩阵的每个单元格的更快方法是什么?
【发布时间】:2018-09-21 20:26:09
【问题描述】:

我需要将以下函数应用于二维矩阵中的每个单元格。我的矩阵最多可以有 100 万个单元格。计算这个更快的方法是什么? 函数如下:

def walkRight(r,c,walls):
    global Pwalk
    global rows
    global columns
    sum = 0
    if c == (columns-1) or [r,c+1] in walls:
        sum = sum + Pwalk * U[r][c]
    else:
        sum = sum + Pwalk * U[r][c+1]
    if r == 0 or [r-1,c] in walls:
        sum = sum + 0.5*(1-Pwalk) * U[r][c]
    else:
        sum = sum + 0.5*(1-Pwalk) *  U[r-1][c]
    if r == rows-1 or [r+1,c] in walls:
        sum = sum + 0.5*(1-Pwalk) * U[r][c]
    else:
        sum = sum + 0.5*(1-Pwalk) * U[r+1][c]
    return sum

【问题讨论】:

  • 如果您真的需要将此函数应用于每个单元格,那么我相信除了迭代 O(n*n) 的所有内容之外别无选择。
  • 或者,如何修改函数,使其可以应用于每个单元格?
  • 如果您将函数应用于每个单元格,则需要调用它 r * c 次,这将导致 O(n*n) 无论函数的定义方式如何。您可以做的是考虑是否有不需要应用此功能的单元格,然后想办法只查找您需要的单元格。但是要获得这方面的帮助,您需要展示更多代码或解释您的程序的功能,以便人们知道您在使用sum 做什么。
  • 尝试提出一个适用于元素块的计算,例如U[1:,:]U[:-1, 1:]
  • 我认为,那行不通。我正在尝试解决一个迷宫,因此,对于每个单元格,我都在尝试使用值迭代找到最佳移动。对于值迭代,我需要为每个单元格找到 Utility。对于每个单元格,我有 4 个动作:向左移动、向右移动、向上移动和向下移动。上面的代码只是展示了一个这样的功能。但在实际问题中,我的效用将是每个动作的最大值。因此,对于每个单元格,我将必须应用 4 个这样的函数,如上所示,矩阵的一个这样的计算将是单次迭代。我需要再次迭代新矩阵。重复此过程。

标签: python python-2.7 numpy


【解决方案1】:

我真的不认为你需要对每个单元应用任何函数来解决迷宫。如果迷宫是基于二维矩阵构建的,则意味着试图寻找出口的物体(人、老鼠等)只能在四个方向上移动:上、下、左和右。

其中一个方向是您来自的方向,因此您可以排除那个方向,从而留下 3 个可能的移动。然后,您需要做的是检查 3 个可能的方向中的哪一个没有墙并遵循该方向。找到分叉点后,存储此位置并随机选择两条可能的路径之一。如果您选择的路径导致了死胡同,您将回到原来的分叉处,然后走另一条路。

因此,当将单个递归函数应用于一个单元格时,它会检查您不是来自的 3 个相邻单元格,应该足以解决 2d 迷宫。我真的不明白为什么你需要将函数应用于迷宫的每个位置。

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2012-07-12
    • 2016-09-05
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多