Python 使用uint8与int64链接操作

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

我有两个函数,它们的行为方式与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.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位部分。