Python中的numpy减法不产生负数(4-6给出254)

15

我希望将两个灰色的人脸相减以查看它们之间的差异,但是我遇到了一个问题,即例如将[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)

两者都不会给出负数,而是将0后的余数从255中减去。

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转换为一个numpy.ndarray(270, 270),在减去每个点在face和nface之间的差异后具有负值?(因此不使用numpy.setdiff1d,因为它仅返回1维而不是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)

无法复制,如果我创建两个NumPy数组,它们的值都在0-255范围内,我可以简单地执行a-b操作,就会得到负数。 - Ffisegydd
2
你的数组必须是无符号整数类型 - 例如尝试使用 dtype=np.int16 - jonrsharpe
2个回答

19
似乎数组的数据类型为uint8,所有数字将被解释为0-255范围内的整数。 在这里,-2等于256-2,因此减法的结果为254。
您需要重新调整数组的数据类型以支持负整数,例如int16如下所示...
face = face.astype(np.int16)

然后减去。


我现在使用了以下代码(abs()用于显示表情):算了,这段代码在这里不起作用,请看我的帖子。 - NumesSanguis

3

您的numpy数组中存在数据类型问题。其中似乎有一个uint8,导致出现了循环包裹。

请查看nfac.dtype以查看其情况。在执行计算操作之前,您需要进行转换。使用numpy.ndarray.astype进行转换或参考NumPy数组的原地类型转换


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接