numpy:以大尾数法写入 uint16 的大型二维数组

问题描述 投票:0回答:2

我正在尝试将

512x512
uint16 2D
数组保存为二进制电影的二进制帧。格式需要是大端,但我不断写入小端数据(尝试在Matlab、java中读取它,它仍然是小端)。我尝试更改字节顺序,如下所示,但无济于事。我很抱歉这是一个愚蠢的问题。

sys.byteorder = 'big'
for frame in range (0,1)
    fid.write(array)
fid.close()
sys.byteorder = 'little';

以下线程似乎相关,但如果我尝试使用 struct.pack 更改字节顺序,则会写入垃圾。

在Python中将整数转换为大端二进制文件

numpy
2个回答
4
投票

您可以使用

<
/
>
dtype 说明符强制更改 numpy 数组的字节顺序:

>>> import numpy as np
>>> a = np.arange(5, dtype=np.uint16)
>>> a.dtype.str
'<u2'
>>> b = a.astype('>u2')

>>> a.tostring()
b'\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00'
>>> b.tostring()
b'\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04'

0
投票

当以大端格式将二进制数据写入文件时,函数

tobytes
非常方便。它需要一个可选参数
order
,必须设置为
'F'
,表示 Fortran 连续:

a = np.array([1,256,257,1025], dtype=np.uint16)
b = a.tobytes('F')

with open('bigendian.bin', 'wb') as fid:
    fid.write(b)

with open('bigendian.bin', 'rb') as fid:
    c = fid.read(8)

assert c == b'\x01\x00\x00\x01\x01\x01\x01\x04'
© www.soinside.com 2019 - 2024. All rights reserved.