如何*实际上*从 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 开始,多字段索引生成的视图保留了源布局。这一变化在几个版本中断断续续地进行着。