避免使用numpy遍历2D数组

时间:2018-07-28 05:52:32

标签: python arrays image loops numpy

我一直试图找出在对图像进行一些分析时如何避免执行2次循环的方法。它是正方形图像(x和y中的尺寸相同)。当前的方法是针对每个像素设置其在数组“ stars”中的位置,第一个坐标是x位置,第二个坐标是y位置,第三个坐标是像素的亮度。我知道必须有一种非常优越的方法来进行设置,但是当i = j时,我尝试的每件事都可以正常工作(基本上只给我该矩阵的对角线)。我该如何做得更好?!

def firstmoment(stars,bins):
    xsum=0.0
    ysum=0.0
    itot=0.0
    for i in range(0, bins):
        for j in range(0, bins):
            xsum=xsum+stars[i][j][0]*stars[i][j][2]
            ysum=ysum+stars[i][j][1]*stars[i][j][2]
            itot=itot+stars[i][j][2]
    x0=xsum/itot
    y0=ysum/itot
    return x0, y0, itot

1 个答案:

答案 0 :(得分:1)

让我们只关注x部分,忽略y,因为它的工作方式相同。

def firstmoment(stars, bins):
    xsum = 0.0
    itot = 0.0
    for i in range(bins):
        for j in range(bins):
            xsum += stars[i][j][0] * stars[i][j][2]
            itot += stars[i][j][2]
    x0 = xsum / itot
    return x0, itot

stars是索引为[x, y, luminance]的3D数组。最后,itot是亮度值之和,通常为stars[:bins,:bins,2].sum()。对xsum使用类似的转换,我们得到:

def firstmoment(stars, bins):
    xsum = (stars[:bins,:bins,0] * stars[:bins,:bins,2]).sum()
    itot = stars[:bins,:bins,2].sum()
    x0 = xsum / itot
    return x0, itot