Python numpy 减法不出现负数 (4-6 得到 254)

15 投票
2 回答
16071 浏览
提问于 2025-04-30 21:30

我想把两个灰色人脸相减,看看它们的差异,但遇到了一个问题,比如说[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)

...然后再进行减法运算。

撰写回答