如何*实际上*从 numpy 结构化数组中删除一列(这样它就不会出现在二进制文件中)
How to *actually* delete a column from numpy structured array (so that it won't show up in binary file)
我有一个从二进制文件加载的结构化数组。
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
生成仅包含所需字段的副本:https://docs.scipy.org/doc/numpy/user/basics.rec.html?highlight=s#numpy.lib.recfunctions.repack_fields。
从 1.16 开始,多字段索引生成的视图保留了源布局。这一变化在几个版本中断断续续地进行着。
我有一个从二进制文件加载的结构化数组。
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
生成仅包含所需字段的副本:https://docs.scipy.org/doc/numpy/user/basics.rec.html?highlight=s#numpy.lib.recfunctions.repack_fields。
从 1.16 开始,多字段索引生成的视图保留了源布局。这一变化在几个版本中断断续续地进行着。