我对使用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行解决方案。
答案 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种颜色。