将numpy数组暴露为C ++向量

时间:2017-03-21 15:48:28

标签: c++ numpy vector

使用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数组怎么样?

编辑:我不想复制数据,否则答案很简单。

1 个答案:

答案 0 :(得分:0)

假设您不想将数据复制到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<>

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

......如果有必要,甚至可以再次复制(假设尺寸相同或更小)

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

最后,请注意std::vector<bool>是特殊的,不会像普通的C风格数组那样工作。