使用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数组怎么样?
编辑:我不想复制数据,否则答案很简单。
答案 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::vector
为const
,因此无法更改大小;这使C风格的数组保持为“主”。
当然,您也可以轻松地将数据复制到std::vector<>
:
std::vector<int> v(arr, arr + s);
......如果有必要,甚至可以再次复制(假设尺寸相同或更小)
std::copy(v.begin(), v.begin()+s, arr);
最后,请注意std::vector<bool>
是特殊的,不会像普通的C风格数组那样工作。