Python 使用uint8与int64链接操作
我有两个函数,它们的行为方式与int64相同,但与uint8的工作方式不同:Python 使用uint8与int64链接操作,python,numpy,Python,Numpy,我有两个函数,它们的行为方式与int64相同,但与uint8的工作方式不同: A_int64 = np.array([1, 2, 3]) B_unit8 = A.astype(np.uint8) def scale_image(image): minv = np.amin(image) maxv = np.amax(image) result = (255 * (image - minv) / (maxv - minv)) return result.asty
A_int64 = np.array([1, 2, 3])
B_unit8 = A.astype(np.uint8)
def scale_image(image):
minv = np.amin(image)
maxv = np.amax(image)
result = (255 * (image - minv) / (maxv - minv))
return result.astype(np.uint8)
def scale_image_multiple_lines(image):
minv = np.amin(image)
maxv = np.amax(image)
image = image - minv
image = image / (maxv - minv)
image = image * 255
return image.astype(np.uint8)
print(scale_image(A_int64)) # [ 0 127 255]
print(scale_image_multiple_lines(A_int64)) # [ 0 127 255]
print(scale_image(B_unit8)) # [ 0 127 127]
print(scale_image_multiple_lines(B_unit8)) # [ 0 127 255]
无法正常工作的是打印(缩放图像(B_单位8))#[0 127]
我的猜测是,多行版本可以同时使用这两种数据类型,因为它可以更早地强制转换。然而,既然我不相信我在处理负数(我减去最小值,但不超过最小值,我不认为),为什么会有不同呢?你说得对了一半。这也是操作的顺序 在第一个函数中,首先乘以255,然后除以max-min。第一个函数在最后一个位置给出一个溢出->(0,255,254),然后我们将truedivide除以2并转换为uint8
第二个True除以第二个True(这意味着强制转换为浮点),因此随后乘以255不会溢出。这个问题最初是在涉及PIL时提出的。我为他们找到了一个解决办法,但我正在努力理解为什么它会起作用。啊!我开始关注未签名部分,没有考虑8位部分。