Python中2d数组子的总和

时间:2015-10-16 10:13:09

标签: python arrays

这是一个任务说明: 我有2d阵列NxM,N,M <1000,并且存在K(K <100000)组坐标(x1,x2,y1,y2)。我需要将矩形(x1,x2,y1,y2)中的所有元素相加 我的代码有效但我需要让它更快,因为最大的测试不能在所需的时间内工作。

这是:

def build_y(cx, fx, lx, cy, fy, ly):
    if fy == ly:
        if fx == lx:
            t[cx][cy] = a[fx][fy]
        else:
            t[cx][cy] = t[cx*2][cy] + t[cx*2+1][cy];
    else:
        my = int((fy + ly) / 2)
        build_y (cx, fx, lx, cy*2, fy, my)
        build_y (cx, fx, lx, cy*2+1, my+1, ly)
        t[cx][cy] = t[cx][cy*2] + t[cx][cy*2+1]

def build_x(cx, fx, lx):
    if fx != lx:
        mx = int((fx + lx) / 2)
        build_x (cx*2, fx, mx)
        build_x (cx*2+1, mx+1, lx)
    build_y (cx, fx, lx, 1, 0, m-1)

def sum_y (cx, cy, tfy, tly, fy, ly):
    if fy > ly:
        return 0
    if fy == tfy and tly == ly:
        return t[cx][cy]
    tmy = int((tfy + tly) / 2)
    return sum_y(cx, cy*2, tfy, tmy, fy, min(ly, tmy)) + sum_y(cx, cy*2+1, tmy+1, tly, max(fy, tmy+1), ly)
def sum_x(cx, tfx, tlx, fx, lx, fy, ly):
    if fx > lx:
        return 0
    if fx == tfx and tlx == lx:
        return sum_y(cx, 1, 0, m-1, fy, ly)
    tmx = int((tfx + tlx) / 2)
    return sum_x(cx*2, tfx, tmx, fx, min(lx, tmx), fy, ly) + sum_x(cx*2+1, tmx+1, tlx, max(fx, tmx+1), lx, fy, ly)
fin = open('input.txt', 'r').read().split()
n = int(fin[0])
m = int(fin[1])
k = int(fin[2])
a = []
b = []
t = [0]*3*n
for i in range(3*n):
    t[i] = [0]*3*m
for i in range(n):
    a.append([int(j) for j in fin[3+i*m:3+i*m+m]])
build_x(1, 0, n-1)
for i in range(k):
    b.append([int(j) for j in fin [3+n*m+4*i:3+n*m+4*i+4]])
for i in range(k):
    print(sum_x(1, 0, n-1, b[i][0]-1, b[i][2]-1, b[i][1]-1, b[i][3]-1))

1 个答案:

答案 0 :(得分:0)

使用numpy并将所有列表重写为numpy数组,例如t[cx][cy] = a[fx][fy]在将t[cx,cy] = a[fx,fy]初始化为numpy数组后变为t, a。你可以简单地获得100倍的加速。事实上,numpy操作比列表操作要快得多,所以如果你有很多这样的操作,那么使用numpy是非常合适的。