np.mean()的值有误吗?

时间:2019-12-27 15:26:27

标签: python image numpy mean

我对使用Python编程非常陌生,所以我不明白这里发生了什么。我有一个图像(35x64)作为3D数组,并使用np.mean(),我试图提取一行中一个颜色通道的平均值:

print(np.mean(img[30][:][0]))

为了进行比较,我还编写了一个for循环,将完全相同的值添加到列表中,并以此来计算均值:

for i in range(64):
    img_list.append(img[30][i][0])
print(np.mean(img_list))

现在,由于一个奇怪的原因,它给出了不同的值:

First output: 117.1
Second output: 65.7

通过查看列表,我发现第二个是正确的。有经验的人可以向我解释为什么这种情况确实发生了,以及如何解决该问题吗?我不想在程序中使用第二个较长的代码块,而是在寻找能给出正确值的1行解决方案。

1 个答案:

答案 0 :(得分:4)

img[30][:][0]img[30,:,0](您所期望的)之间有细微的差别。 让我们看一个例子:

img = np.arange(35*64*3).reshape(35,64,3)
img[30][:][0]
# array([5760, 5761, 5762])
img[30,:,0]
# array([5760, 5763, ... 5946, 5949])

所以您只需要:

print(np.mean(img[30,:,0]))

(反正效率更高)。

一些细节:按照您的原始语法,[:]实际上只是触发了数组的副本:

xx = img[30]
yy = img[30][:]
print (xx is yy, xx.shape, yy.shape, np.all(xx==yy))
# False (64, 3) (64, 3) True # i.e. both array are equal 

因此,当您使用img[30][:][0]时,实际上就是第30行第一个像素的3种颜色。