np.mean() 的值错误?

Wrong values with np.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

通过查看列表,我发现第二个是正确的。有更多经验的人可以向我解释为什么会发生这种情况以及如何解决吗?我不想在我的程序中使用第二个更长的代码块,但我正在寻找提供正确值的单行解决方案。

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 种颜色。