从二进制文件读取 numpy 数组作为 float16 而不是 float32 重塑输入

Reading numpy array from binary file as float16 instead of float32 reshapes the input

我正在尝试读取形状为 804 x 600 的 .pfm 图像,我为此编写了一个这样的函数。我知道我的图像是 float16,但它们被读取为 float32。

def read_pfm(file):
    """Method to decode .pfm files and return data as numpy array"""
    f = open(file, "rb")

    # read information on number of channels and shape
    line1, line2, line3 = (f.readline() for _ in range(3))
    width, height = (int(s) for s in line2.split())

    # read data as big endian float
    data = np.fromfile(f,'>f') # TODO: data is read as float32. Why? Should be float16
    print(data.dtype)
    print(data.shape)
    data = np.reshape(data, shape)
    return data

我的问题有两个:

  1. 为什么我的图片是 float16 而默认读取为 float32?
  2. 当我以这种方式强制将图像读取为 float16 时

data = np.fromfile(f,'>f2')

输入的形状从 (482400,) 变为 (964800,)。为什么会这样?

编辑:我发现我弄错了,图像实际上是float32。然而,Daweo 的回答仍然澄清了我对 16-/32-bit 的困惑。

When I do force the images to be read as float16(...)the shape of input changes from (482400,) to (964800,). Why does this happen?

观察 482400 * 2 == 96480032/16 == 2。 考虑一个简单的例子,假设你有以下 8 位

01101110

当您被指示使用 8 位整数时,您会认为它是单个数字 (01101110),但当指示您使用 4 位整数时,您会认为它是 2 个数字 (0110, 1110),当指示使用 2 位整数时,您会认为它是 4 个数字 (01、10、11、10)。同样地,如果假设持有 float32 的给定字节序列确实包含 N 个数字,那么被视为持有 float16 的相同字节序列确实包含 N*(32/16) 即 N*2 个数字。