【发布时间】:2013-11-26 04:43:56
【问题描述】:
我正在使用 numpy 的 fromfile 函数从二进制文件中读取数据。该文件包含一系列值 (3 * float32, 3 * int8, 3 * float32),我想将其提取到具有 (rows, 9) 形状的 numpy ndarray 中。
with open('file/path', 'rb') as my_file:
my_dtype = np.dtype('>f4, >f4, >f4, >i1, >i1, >i1, >f4, >f4, >f4' )
my_array = np.fromfile( my_file, dtype = my_dtype )
print(my_array.shape)
print(type(my_array[0]))
print(my_array[0])
这会返回:
(38475732,)
<type 'numpy.void'>
(-775.0602416992188, -71.0, -242.5240020751953, 39, 39, 39, 5.0, 2753.0, 15328.0)
如何获得形状为 (38475732, 9,) 的二维 ndarray?
为什么返回的元组是“numpy.void”类型的?
重新定义问题:
如果我想从文件中读取的所有值都是 4 字节浮点数,我会使用 np.dtype('9>f4') 并且我会得到我需要的。但是,由于我的二进制文件包含不同的类型,有没有办法将所有值转换为 32 位浮点数?
PS:我可以使用 'struct' 将二进制文件解析为列表,然后将此列表转换为 ndarray,但这种方法比使用 np.fromfile 慢得多
解决办法:
感谢 Hpaulj 的回答!我在代码中所做的是添加以下行以将 numpy fromfile 函数返回的 recarray 转换为预期的 ndarray:
my_array = my_array.astype('f4, f4, f4, f4, f4, f4, f4, f4, f4').view(dtype='f4').reshape(my_array.shape[0], 9)
返回一个 (38475732, 9) ndarray
干杯!
【问题讨论】:
-
sys.byteorder 的值是多少?
-
它返回“小”,但我不明白为什么这很重要......
-
你正在使用'>',它是大端的。您是否尝试使用“
-
我在元组中得到的值是正确的。问题在于定义映射到 2d ndarray 的 dtype 表达式