将 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::vector
是const
,这样大小就不能改变了;这将 C 样式的数组保持为“主”。
当然,您也可以轻松地将数据复制到std::vector<>
:
std::vector<int> v(arr, arr + s);
...如有必要,甚至可以再次复制回来(假设大小相同或更小)
std::copy(v.begin(), v.begin()+s, arr);
最后,请注意std::vector<bool>
是特殊的,不会像普通的 C 样式数组那样工作。
【讨论】:
你从一个向量开始......作为一个合适的例子,你应该从一个数组开始;) 是否使用std::vector<std::reference_wrapper>
不需要复制所有bool
(8 位)但每个bool*
(64 位)使得这个答案比复制整个布尔向量更糟糕?以上是关于将 numpy 数组公开为 C++ 向量的主要内容,如果未能解决你的问题,请参考以下文章