【问题标题】:Is it possible to get the array base, not just the view, from PyBind11?是否有可能从 PyBind11 获取数组基础,而不仅仅是视图?
【发布时间】:2021-12-03 05:51:48
【问题描述】:

Python 中的 Numpy 数组有两种:基本数组和视图。

但是,我看不到从缓冲区协议中区分这两种数组的方法,也看不到在 C++ 中从视图中获取基本数组的方法。

是否可以使用 Buffer 协议或从 Python 对象确定 PyBind11 中的基本数组?

我需要这个,以便我可以将与数组关联的整个内存缓冲区写入磁盘,以便以后可以正确重建它。

【问题讨论】:

    标签: python c++ numpy buffer pybind11


    【解决方案1】:

    Numpy 已经有保存数组的工具:np.savenp.load。你甚至可以拥有一个带有np.memmap 的 mmap 数组。

    如果您仍想自己实现这一点,pybind11 的缓冲区包装器可以生成一个 py::buffer_info 对象,该对象将包含有关缓冲区数据在内存中存储位置和方式的信息。

    作为documented herebuffer_info 结构如下所示:

    struct buffer_info {
        void *ptr;
        py::ssize_t itemsize;
        std::string format;
        py::ssize_t ndim;
        std::vector<py::ssize_t> shape;
        std::vector<py::ssize_t> strides;
    };
    

    你可以这样访问它:

    void f(py::buffer my_buffer) {
      py::buffer_info my_buffer_info = my_buffer.request();
      do_something(my_buffer_info.ptr);
    }
    

    【讨论】:

    • 谢谢,我已经使用 buffer_info 结构来获取数组视图。但是,我认为该结构不包含有关数组基础的任何信息。我想要访问基础的原因是,同一数组上的多个视图只能存储一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多