python - 使用numpy结构化数组读取二进制文件

标签 python numpy multidimensional-array

我正在使用以下方法读取二进制文件

numpy.fromfile(file, dtype=)

二进制文件有多种类型,我知道其组织。因此我定义了一个 dtype 数组,如下所示:

dtypearr = [('a','i4',1),('b','S1',8),('c','i4',1),
 ('d','i4',1),('e','S1',8)]

这个 dtype 数组表示二进制文件的第一个值是一个整数,后跟 8 个字符等...

我遇到的问题是二进制文件不是 dtypearr 的大小。二进制文件具有 dtypearr 中定义的结构重复 n 次

到目前为止,我所做的就是使用新的字段名称重复 dtypearr,直到它与二进制文件的大小相同。

但是,我希望以某种方式,我可以在不重复 dtypearr 的情况下实现这个目标。相反,我希望在每个字段中存储一个数组。例如,我想要结构化数组['a']或结构化数组['b']给我一个数组而不是单个值。

编辑

请注意:

numpy.fromfile(file, dtype=dtypearr)

当图案完全相同时实现我想要的。下面的解决方案也有效。

但是,我提到的二进制文件中的模式并不完全重复。例如,有一个标题部分和多个小节。每个小节都有自己的重复模式。 f.seek() 适用于最后一小节,但不适用于之前的小节。

最佳答案

尝试:

import numpy as np
import string

# Create some fake data
N = 10
dtype = np.dtype([('a', 'i4'), ('b', 'S8'), ('c', 'f8')])
a = np.zeros(N, dtype)
a['a'] = np.random.random_integers(0,3, N)
a['b'] = np.array([x for x in string.ascii_lowercase[:N]])
a['c'] = np.random.normal(size=(N,))

# Write to a binary file
a.tofile('test.dat')

# Read data into new array
b = np.fromfile('test.dat', dtype=dtype)

数组 ab 相同(即 np.all(a['a'] == b['a']) 为 True ):

for col in a.dtype.names:
    print col, np.all(a[col] == b[col])

# Prints:
# a True
# b True
# c True

更新:

如果有头信息,可以先打开文件,查找到数据的起始点,然后读取。例如:

f = open("test.dat", "rb")
f.seek(header_size)
b = np.fromfile(f, dtype=dtype)
f.close() 

您必须知道大小 (header_size),但这样就可以了。如果有小节,您可以提供要抓取的项目数。我还没有测试过计数是否有效。如果您不受此二进制格式的限制,我建议使用 hdf5 之类的东西在单个文件中存储多个数组。

关于python - 使用numpy结构化数组读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37164347/

相关文章:

python - np.mean() 导致内存不足错误

c++ - 在 C++ 中将多维数组转换为指针

python - 从 Dataframe Pandas 中提取多个范围

python - 终端上 Python 的着色异常

python - 如何从另一个数组的值中获取一个 numpy 数组 (Python)

Python - 使用 Numpy 快速放大数组,不允许使用图像库

python - Discord.py 的 on_member_leave 事件不起作用

python - 如何组合元组中的元素或相应地列出python

C二维数组二维数组

c - 使用指针的二维数组