使用numpy结构化数组

时间:2016-05-11 13:35:44

标签: 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的情况下实现这一目标。相反,我希望在每个字段中存储一个数组。例如,我想要structuredarray [' a']或structuredarray [' b']给我一个数组而不是单个值。

修改

请注意:

numpy.fromfile(file, dtype=dtypearr)

当模式完全相同时,实现我想要的。以下解决方案也有效。

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

1 个答案:

答案 0 :(得分:3)

尝试:

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']) is 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这样的东西将多个数组存储在一个文件中。