Python numpy 减法不出现负数 (4-6 得到 254)
我想把两个灰色人脸相减,看看它们的差异,但遇到了一个问题,比如说[4] - [6]的结果是[254],而不是[-2](或者说差值是[2])。
print(type(face)) #<type 'numpy.ndarray'>
print(face.shape) #(270, 270)
print(type(nface)) #<type 'numpy.ndarray'>
print(nface.shape) #(270, 270)
#This is what I want to do:
sface = face - self.nface #or
sface = np.subtract(face, self.nface)
这两种情况都不会给出负数,而是从255中减去0之后的结果。
下面是sface的输出示例:
[[ 8 255 8 ..., 0 252 3]
[ 24 18 14 ..., 255 254 254]
[ 12 12 12 ..., 0 2 254]
...,
[245 245 251 ..., 160 163 176]
[249 249 252 ..., 157 163 172]
[253 251 247 ..., 155 159 173]]
我的问题: 我该如何让sface变成一个形状为(270,270)的numpy.ndarray,里面要么是负值,要么是每个点在脸和nface之间的差值?(所以不能用numpy.setdiff1d,因为这个只返回一维数据,而我需要的是270x270的格式)
工作进展
根据@ajcr的回答,我做了以下操作(使用abs()来显示相减后的脸):
face_16 = face.astype(np.int16)
nface_16 = nface.astype(np.int16)
sface_16 = np.subtract(face_16, nface_16)
sface_16 = abs(sface_16)
sface = sface_16.astype(np.int8)
2 个回答
3
这是你在numpy数组中数据类型的问题。你里面有一个uint8类型,这个类型似乎出现了环绕现象。
你可以查看nfac.dtype,它会告诉你具体是什么类型。在进行计算之前,你需要先转换一下这个数据类型。可以使用numpy.ndarray.astype来进行转换,或者看看这个链接:NumPy数组的原地类型转换。
19
听起来这个数组的类型是 uint8
,也就是无符号的8位整数。所有的数字都会被看作是0到255之间的整数。在这里,-2被当作256减去2来理解,所以结果是254。
你需要把数组的类型改成支持负数的,比如 int16
,可以这样做...
face = face.astype(np.int16)
...然后再进行减法运算。