Python 使用numpy避免二维阵列上的循环
在对图像进行分析时,我一直在想如何避免做2个循环。它是一个正方形的图像,在x和y轴上的尺寸相同。当前的方法是为每个像素设置,在阵列星中,第一个坐标是x位置,第二个坐标是y位置,第三个坐标是像素的亮度。我知道一定有一个非常好的方法来建立这个矩阵,但我尝试的每一件事都是在I=j时起作用的,基本上只有这个矩阵的对角线。我怎么才能做得更好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
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