【问题标题】:numpy array flags information is not saved when dumping to pickle转储到pickle时不保存numpy数组标志信息
【发布时间】:2016-08-11 16:50:54
【问题描述】:

我正在编写一个具有 numpy 数组类型属性的类。 由于我希望它是只读的,因此我将其 WRITABLE 标志设置为 false:

import numpy as np
class MyClass:
    def __init__(self):
        self.my_array = np.zeros(5)
        self.my_array.setflags(write=False)

在做一些其他事情之后,我将 MyClass 转储到一个 pickle 文件中:

pickle.dump(self, writer)

稍后,我使用x = pickle.load(reader) 加载它,但随后 WRITABLE 标志为真。 如何使泡菜转储以保留 numpy 数组 WRITABLE 标志?

【问题讨论】:

  • 您的构造函数仅在您创建对象实例时运行。你是怎么发现它没有设置标志的?
  • 标志没有被保留并不奇怪,因为它们中的大多数代表了酸洗/解酸过程不会保留的属性。例如,C_CONTIGUOUS 和 OWNDATA。

标签: python arrays numpy pickle


【解决方案1】:

对于酸洗数组,numpy 使用np.save 函数。此保存的详细信息在np.lib.format 文件中。此格式保存数据缓冲区的标头和字节表示。 header 的内容是一个字典。

In [1212]: np.lib.format.header_data_from_array_1_0(x)
Out[1212]: {'descr': '<i4', 'fortran_order': False, 'shape': (2, 3)}
In [1213]: np.lib.format.header_data_from_array_1_0(u)
Out[1213]: {'descr': '<c16', 'fortran_order': False, 'shape': (4,)}

如您所见,它并没有保存整个FLAGS 属性,只保存了订单信息。

可以使用__reduce____setstate__ 方法自定义类酸洗。

另见

How can I make np.save work for an ndarray subclass?

【讨论】:

    猜你喜欢
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多