四时宝库

程序员的知识宝库

Numpy读写二进制数据和NCL二进制数据I/O

  • Numpy读写二进制数据

Numpy.fromfile()

numpy.fromfile(file, dtype=float, count=-1, sep='')可以高效读取已知数据类型的二进制文件。file表示文件名,dtype表示数据类型(包括大小和字节顺序),count表示读入数据长度,sep表示文本文件的分隔符,默认为空表示读取二进制数据。

>>>type = np.float32

>>>data = np.fromfile(file,dtype=type)

>>>lon , lat = data.reshape(2,2288,2288)

>>> lat

array([300., 300., 300., ..., 300., 300., 300.], dtype=float32)

>>> lat.dtype

dtype('float32')


前面提到数据类型除了包括大小,还包括字节顺序。字节顺序是通过对数据类型预先设定"<"或">"来决定的。"<"意味着小端法LittleEndian(最小值存储在最小的地址,即低位组放在最前面)。">"意味着大端法BigEndian(最重要的字节存储在最小的地址,即高位组放在最前面)。这里读入一个BigEndian数据,并强制转换其类型。

>>> cld = np.fromfile(file,dtype=">f4")

>>> cld

array([nan, nan, nan, ..., nan, nan, nan], dtype=float32)

>>> cld.dtype

dtype('>f4') #BigEndian

>>> t2 = np.dtype("<f4")

>>> cld = cld.astype(t2) #强制转换数据类型

>>> cld.dtype

dtype('float32')

NUmpy.tofile()

ndarray.tofile(fid, sep="", format="%s")可用于输出二进制文件(或者文本文件,sep,format),数据总是以“C”的顺序输出。

>>> cld.tofile(“test_out.bin”)


  • NCL二进制数据I/O

Fortran顺序

Direct Access:

data = fbindirread(path,rec,dim,type)

Sequential Access:

data = fbinrecread(path,rec,dim,type)

C 顺序

Cray (C block IO write):

data = cbinread(path,dim,type)

Cray Sequential:

data = craybinrecread(path,rec,dim,type)

此外同样需要注意big-endian 和 little-endian的区别,可以通过命令

  • setfileoption("bin","ReadByteOrder","LittleEndian")
  • setfileoption("bin","WriteByteOrder","BigEndian")

控制文件的正确读取。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接