Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy避免二维阵列上的循环_Python_Arrays_Image_Loops_Numpy - Fatal编程技术网

Python 使用numpy避免二维阵列上的循环

Python 使用numpy避免二维阵列上的循环,python,arrays,image,loops,numpy,Python,Arrays,Image,Loops,Numpy,在对图像进行分析时,我一直在想如何避免做2个循环。它是一个正方形的图像,在x和y轴上的尺寸相同。当前的方法是为每个像素设置,在阵列星中,第一个坐标是x位置,第二个坐标是y位置,第三个坐标是像素的亮度。我知道一定有一个非常好的方法来建立这个矩阵,但我尝试的每一件事都是在I=j时起作用的,基本上只有这个矩阵的对角线。我怎么才能做得更好 def firstmoment(stars,bins): xsum=0.0 ysum=0.0 itot=0.0 for i in ra

在对图像进行分析时,我一直在想如何避免做2个循环。它是一个正方形的图像,在x和y轴上的尺寸相同。当前的方法是为每个像素设置,在阵列星中,第一个坐标是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
让我们只关注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,亮度]的3D阵列。最后,itot是亮度值的总和,通常是星体[:bin,:bin,2].sum。使用类似的xsum转换,我们得到:


请提供一些有代表性的星号和箱子示例数据。看看如何做一个小游戏。还包括您提供的样本数据的预期输出,这样答案可以验证其正确性。老实说,我不确定您是否可以将2个循环减少为一个循环,除非存在非常特殊的条件[例如,如您已经说过的,在对角线上工作]。该图像是一个二维区域,一般来说,您无法避免沿着其二维运行循环。与处理方形矩阵时通常不能跳过两个循环的方式相同,例如xsum=np.sumstars[:,:,0]*stars[:,:,2]。谢谢你帮我摆脱这些圈圈!这就像一种魅力,速度肯定更快:
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