将 numpy 数组公开为 C++ 向量

Posted

技术标签:

【中文标题】将 numpy 数组公开为 C++ 向量【英文标题】:Expose a numpy array as a C++ vector 【发布时间】:2017-03-21 15:48:27 【问题描述】:

使用PyArray_SimpleNewFromData,很容易将std::vector公开为一个numpy数组。我现在正试图做相反的事情:将一个 numpy 数组公开为一个 c++ 向量。

可以公开为 C 数组:

// get the size
npy_intp s = PyArray_SIZE(numpy_array);
// get the pointer to the array
bool* c_array = (bool*) PyArray_GETPTR1( numpy_array, 0 );
// Do something
for(unsigned int i=0; i<s; i++)
    c_array[i] = ... ;

现在用 c++ 向量代替 c 数组怎么样?

编辑:我不想复制数据,否则答案是微不足道的。

【问题讨论】:

您可以简单地使用数组作为初始化器来构造一个新向量... @J.H.Bonarius,我编辑了问题以指定我不希望复制数据。只“暴露”它。例如,我可能想修改数组的一个元素。 【参考方案1】:

假设您不想只是将数据复制到 std::vector,您可能会发现 std::reference_wrapper 很有用。

int main()

    std::vector<int> numpy_array_ 1, 2, 3, 4 ;
    const auto s = numpy_array_.size();
    auto arr = numpy_array_.data();

    // ...

    for (size_t i = 0; i < s; i++)
        arr[i] += 10;

    const std::vector<std::reference_wrapper<int>> v(arr, arr + s);
    void f(const std::vector<std::reference_wrapper<int>>&);
    f(v);

    return 0;


void f(const std::vector<std::reference_wrapper<int>>& v)

    for (size_t i = 0; i < v.size(); i++)
        v[i] += 100;

注意std::vectorconst,这样大小就不能改变了;这将 C 样式的数组保持为“主”。

当然,您也可以轻松地将数据复制到std::vector&lt;&gt;

std::vector<int> v(arr, arr + s);

...如有必要,甚至可以再次复制回来(假设大小相同或更小)

std::copy(v.begin(), v.begin()+s, arr);

最后,请注意std::vector&lt;bool&gt; 是特殊的,不会像普通的 C 样式数组那样工作。

【讨论】:

你从一个向量开始......作为一个合适的例子,你应该从一个数组开始;) 是否使用std::vector&lt;std::reference_wrapper&gt; 不需要复制所有bool(8 位)但每个bool*(64 位)使得这个答案比复制整个布尔向量更糟糕?

以上是关于将 numpy 数组公开为 C++ 向量的主要内容,如果未能解决你的问题,请参考以下文章

使用 SWIG 将向量公开为内存视图

使用 swig 使 C++ 类看起来像一个 numpy 数组

通过 COM 为 C++ 客户端公开 C#

将 NumPy 向量转换为二维数组/矩阵

如何使用属性将私有数组公开为只读? [关闭]

用于将数组/向量发送到 C++ 脚本的 Cython 示例