【问题标题】:How to *actually* delete a column from numpy structured array (so that it won't show up in binary file)如何*实际上*从 numpy 结构化数组中删除一列(这样它就不会出现在二进制文件中)
【发布时间】: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


【解决方案1】:

使用repack_fields 生成仅包含所需字段的副本:https://docs.scipy.org/doc/numpy/user/basics.rec.html?highlight=s#numpy.lib.recfunctions.repack_fields

从 1.16 开始,多字段索引会生成一个保留源布局的视图。这种变化在多个版本中都在进行中,时断时续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多