使用Numpy高效计算累加和表

5
我将尝试使用Python和Numpy计算特征计数矩阵的总面积表。目前,我正在使用以下代码:
def summed_area_table(img):

    table = np.zeros_like(img).astype(int)

    for row in range(img.shape[0]):
        for col in range(img.shape[1]):

            if (row > 0) and (col > 0):
                table[row, col] = (img[row, col] +
                                   table[row, col - 1] +
                                   table[row - 1, col] -
                                   table[row - 1, col - 1])
            elif row > 0:   
                table[row, col] = img[row, col] + table[row - 1, col]
            elif col > 0:
                table[row, col] = img[row, col] + table[row, col - 1]
            else:
                table[row, col] = img[row, col]

    return table

上述代码在一个3200 x 1400的数组上执行计算大约需要35秒钟。有没有使用Numpy技巧来加速计算的方法?我意识到基本的速度问题在于嵌套的Python循环,但我不知道如何避免它们。
1个回答

13

NumPy有一个cumsum函数用于计算累加和。将其应用两次即可得到所需的表格:

import numpy as np

A = np.random.randint(0, 10, (3, 4))

print A
print A.cumsum(axis=0).cumsum(axis=1)

输出:

[[7 4 7 2]
 [6 9 9 5]
 [6 6 7 6]]
[[ 7 11 18 20]
 [13 26 42 49]
 [19 38 61 74]]

性能分析: (https://dev59.com/TYLba4cB1Zd3GeqPgJDr#25351344)

性能分析是评估和优化计算机程序性能的过程。它可以帮助识别瓶颈和优化机会,从而提高程序的运行速度和效率。

import numpy as np
import time

A = np.random.randint(0, 10, (3200, 1400))

t = time.time()
S = A.cumsum(axis=0).cumsum(axis=1)
print np.round_(time.time() - t, 3), 'sec elapsed'

输出:

0.15 sec elapsed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接