使用uint8与int64进行链接操作

时间:2018-06-17 15:10:33

标签: 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.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]

不按预期工作的是print(scale_image(B_unit8)) # [ 0 127 127]

我的猜测是多行版本适用于这两种数据类型,因为它之前会进行转换。但是,因为我不相信我正在处理否定(我减去最小值但不超过这个,我不认为)为什么它会产生影响呢?

1 个答案:

答案 0 :(得分:2)

你是对的。这也是操作的顺序。

在第一个函数中,首先乘以255,然后除以max-min。第一个在最后一个位置给出溢出 - > (0,255,254)然后我们用2进行判断并转换为uint8

第二个第一个被两个第一个(它需要一个转换为浮动),所以后续乘以255不会溢出。