首页 > 解决方案 > 删除 for 循环以使其更快 - numpy

问题描述

我有这个使用numpy的python代码:

import numpy as np
table = np.array([[23, 54, 12], 
                 [17, 32, 25],
                 [43, 19, 11],
                 [31, 22, 10],
                 [21, 19, 35]])
r, c = table.shape
out = np.zeros((r,c)) 
out[0, :] = np.cumsum(table[0,:])
out[:, 0] = np.cumsum(table[:,0]) 

for j in range(1, c):
    for i in range(1, r):
        out[i,j] = max( out[i-1,j], out[i,j-1] ) + table[i,j]

out[-1,-1]

我首先计算数组“out”的第一行和第一列,而其余的值是用 for 循环内的等式计算的。我只对表格的最后一个值( out[-1,-1] )感兴趣,我想尽可能快地完成它。我可以以某种方式删除两个“for”循环吗?

标签: pythonperformancenumpy

解决方案


我不完全确定您要完成什么。

您正在创建一个新out数组,该数组从原始表中复制第一(0)行和列。(顺便说一下,在 处out[:, 0] = np.cumsum(table[:,0]),您会覆盖在 处的元素[0, 0])。

out然后,您可以通过取前一行中的元素或前一列中的元素的最大值来填充数组的其余部分。

然后,您将该位置的原始数组的内容添加table到最大值。

由于您正在查找数组中以前的行和列,因此out您经常会发现自己处于在检查这些值之前已覆盖这些值的情况。例如,当你在 时i=2, j=1,你有数组

[[ 23.  77.  89.]
 [ 40. 109.   0.]
 [ 83.  *?*   0.]
 [114.   0.   0.]
 [135.   0.   0.]]

您正在*?*检查 109 和 83。您刚刚在上一次迭代中插入了 109。

因此,如果不使用那些 for 循环,您将无法获得相同的结果。


推荐阅读