【发布时间】:2020-05-09 23:37:02
【问题描述】:
我有一个从二进制文件加载的结构化数组。
In [85]: dx = np.dtype([('op', '<u8'), ('me', '<u8'), ('gw', '<u8'), ('md', '<u8'), ('tt', '<u8'), ('bb', '<u8'), ('en', '<u8'), ('ab', '<u8'), ('st', 'u1')])
In [86]: s = np.fromfile("somefile.bin", dtype=dx)
In [87]: s
Out[87]:
array([(1574647200000000000, 1574647200000000000, 1574647200000000000, 1574647200000000000, 1574647200000000000, 1574647200000000000, 19374, 9223372036854775808, 0)],
dtype=[('op', '<u8'), ('me', '<u8'), ('gw', '<u8'), ('md', '<u8'), ('tt', '<u8'), ('bb', '<u8'), ('en', '<u8'), ('ab', '<u8'), ('st', 'u1')])
现在我需要删除其中的一些列,并将数据保存为可从 C 加载的二进制格式。
在 numpy v1.13.3 中,以下代码工作文件:
In [88]: x = s[['op', 'st']]
In [89]: x
Out[89]:
array([(1574647200000000000, 0)],
dtype={'names':['op','st'], 'formats':['<u8','u1'], 'offsets':[0,64], 'itemsize':65})
In [90]: x.tofile("updated.bin")
意思是,如果我现在在十六进制编辑器或 C 代码中打开 updated.bin,它只有 8 字节和 1 字节的 uint 值。
现在切换到 numpy v1.17.1 或 1.18.x,
该代码不起作用,二进制文件包含第一个文件中的所有数据!好像当我做x = s[...] x 时仍然是一个视图,当将 x 写入文件时,它写入了整个数据。
我尝试了np.delete() 和np.copy() 和ndarray.copy(),但没有成功。
谁能帮帮我?
【问题讨论】:
-
使用
repack_fields生成仅包含所需字段的副本:docs.scipy.org/doc/numpy/user/…。从 1.16 开始,多字段索引生成view,它保留了源布局。这种变化在几个版本中都在进行中,时断时续。 -
@hpaulj:这就是答案!
-
@hpaulj 谢谢。这就是解决方案。如果您将评论变成答案,那就太好了!给未来的人;
标签: python numpy multidimensional-array numpy-slicing structured-array