Python 相等的数组,但视觉上不相同

Python 相等的数组,但视觉上不相同,python,numpy,matplotlib,keras,Python,Numpy,Matplotlib,Keras,我有一个32x32x3的图像,比如keras中的一个cifar10图像。 现在,假设我想做一些操作。首先,为了确保我做的正确,我尝试复制图像(这不是我想要做的,所以请不要告诉我如何在不执行三个循环的情况下复制图像,我需要三个循环来操作一些值) 现在,如果我测试它们是否相同,它们是,事实上我看到“酷”打印出来 if (im==imC).all(): print "cool" 但当我试图想象它们时,它们是不同的: plt.imshow( imC ) plt.show() plt.imshow

我有一个32x32x3的图像,比如keras中的一个cifar10图像。 现在,假设我想做一些操作。首先,为了确保我做的正确,我尝试复制图像(这不是我想要做的,所以请不要告诉我如何在不执行三个循环的情况下复制图像,我需要三个循环来操作一些值)

现在,如果我测试它们是否相同,它们是,事实上我看到“酷”打印出来

if (im==imC).all():
  print "cool"
但当我试图想象它们时,它们是不同的:

plt.imshow( imC )
plt.show()

plt.imshow( im )
plt.show()

发生了什么?

Python CIFAR10数据集中的图像具有类型为
numpy.uint8
的像素值。(可能是从PNG文件或类似文件中读取的)因此
X_train.dtype==numpy.uint8
,因此
im.dtype==numpy.uint8

创建的数组的默认元素类型为
numpy.float64
。换句话说,
imC.dtype==numpy.uint8

碰巧,
matplotlib.pyplot.imshow
会根据其元素类型对其输入进行不同的处理。特别是,如果您给它一个元素类型为
uint8
的m-x-n-x-3数组,那么对于三个颜色通道中的每一个,0表示最暗,255表示最亮,正如您所期望的那样;但是,如果给它一个元素类型为
float64
的m-by-n-by-3数组,它希望所有值都在0(最暗)到1(最亮)的范围内,文档中没有说明该范围以外的值会发生什么

我将冒险猜测超出该范围的值会发生什么情况:我认为代码可能会这样做:乘以255,四舍五入到整数,将其视为
uint8
。这意味着0变为0,1变为255

但是,如果最后一步意味着除了低8位之外,所有的都被丢弃了,那么这也意味着2变成254,3变成253,…,255变成1!换句话说,如果你犯了一个很容易理解的错误,给了
imshow
一个像素值浮动在0..255范围内的图像,这些值将被有效地取反,因此0->0,1->255,2->254,…,255->1。(这与完全颠倒范围不同,因为保留了0。)


这就是发生在您身上的情况:
imC
的每个元素在数字上等于
im
的对应元素,但是因为
imC
是一个浮点数组,而不是一个无符号小整数数组,所以它得到了上述处理,你几乎可以得到你期望的图像的底片。

它们有什么不同?也许你可以把这两个数组的元素类型添加到这个问题上?(
im.dtype
imC.dtype
)@Gareth,我认为您的想法是正确的,我得到(im.dtype,imC.dtype)=(uint8,float64)我认为
imshow
希望浮点m-by-n-by-3数组中的RGB值被规范化为0..1范围。如果执行
plt.imshow(imC/255)
,会发生什么情况?关键是
imshow
明确地查看您给定的数组的元素类型,并对
uint8
float64
执行不同的操作。这是我得到的最好答案!谢谢很高兴为您服务!
plt.imshow( imC )
plt.show()

plt.imshow( im )
plt.show()