Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不复制数据的情况下将std::vector转换为NumPy数组 我有一个C++库,里面有一些方法,里面返回一个 STD::vector < /C> >定义为 public: const std::vector<uint32_t>& getValues() const;_C++_Python_Numpy_Swig - Fatal编程技术网

在不复制数据的情况下将std::vector转换为NumPy数组 我有一个C++库,里面有一些方法,里面返回一个 STD::vector < /C> >定义为 public: const std::vector<uint32_t>& getValues() const;

在不复制数据的情况下将std::vector转换为NumPy数组 我有一个C++库,里面有一些方法,里面返回一个 STD::vector < /C> >定义为 public: const std::vector<uint32_t>& getValues() const;,c++,python,numpy,swig,C++,Python,Numpy,Swig,但这会导致原始向量中的所有条目首先由SWIG复制到Python元组中,然后由我再次复制到numpy数组中。因为这个向量可能非常大,所以我宁愿避免制作这两个副本,并希望找到一种方法让SWIG在内存中的原始向量数据周围创建一个numpy.array包装器 我已经阅读了文档,但是明确地提到了输出数组不被支持,因为它们看起来是在C样式数组而不是C++向量的假设下工作的。 数组的底层数据结构只是一个C样式数组,它是C++的STD::vector,所以我希望在内存中访问相同的数据是可行的。 有没有办法让Si

但这会导致原始向量中的所有条目首先由SWIG复制到Python元组中,然后由我再次复制到numpy数组中。因为这个向量可能非常大,所以我宁愿避免制作这两个副本,并希望找到一种方法让SWIG在内存中的原始向量数据周围创建一个numpy.array包装器

我已经阅读了文档,但是明确地提到了输出数组不被支持,因为它们看起来是在C样式数组而不是C++向量的假设下工作的。 数组的底层数据结构只是一个C样式数组,它是C++的STD::vector,所以我希望在内存中访问相同的数据是可行的。


有没有办法让Sigg返回一个不复制原始数据的NUPYPART数组?

显然,将C++向量“(c))数组“投”是微不足道的,请看这个问题的答案:

接下来,您可以创建一个numpy数组,该数组将使用该C数组,而无需复制、查看或谷歌搜索
PyArray\u SimpleNewFromData


我不希望SWIG自动为您完成所有这些,相反,您可能应该自己为您的函数
getValues
编写一个包装,比如
getValuesAsNumPyArray
,似乎
PyArray\u SimpleNewFromData
需要您自己进行内存管理;如果内存管理已经在C++端上处理,也就是说Python对内存不负责,可以使用<代码> NP.ASARTAs/CODE >获得一个与C++向量共享内存的NUMPY数组,比如:
from libcpp.vector cimport vector
import numpy as np
cdef vector[double] vec
vec.push_back(1)
vec.push_back(2)
cdef double *vec_ptr = &vec[0]    # get hold of data array underlying vec; also vec.data() if you have C++11
cdef double[::1] vec_view = <double[:vec.size()]>vec_ptr    # cast to typed memory view
vec_npr = np.asarray(vec_view)    # get numpy array from memory view
print(vec_npr)    # array([1.0, 2.0])
来自libcpp.vector cimport vector
将numpy作为np导入
cdef向量[双]向量
向量推回(1)
向量推回(2)
cdef double*vec_ptr=&vec[0]#获取vec底层的数据数组;如果您有C++11,也可以使用vec.data()
cdef double[::1]vec_view=vec_ptr#转换为类型化内存视图
vec_npr=np.asarray(vec_视图)#从内存视图获取numpy数组
打印(vec_npr)#数组([1.0,2.0])

< Kurt Smith的Cython书第10章中的“包装C和C++数组”部分提供了很好的例子。另请参见。

这导致python崩溃。这是可行的,但是
np.asarray
速度很慢。使用
PyArray\u SimpleNewFromData
可获得更好的性能。在调用任何
PyArray.*
函数之前,请记住调用
import\u array
函数。
from libcpp.vector cimport vector
import numpy as np
cdef vector[double] vec
vec.push_back(1)
vec.push_back(2)
cdef double *vec_ptr = &vec[0]    # get hold of data array underlying vec; also vec.data() if you have C++11
cdef double[::1] vec_view = <double[:vec.size()]>vec_ptr    # cast to typed memory view
vec_npr = np.asarray(vec_view)    # get numpy array from memory view
print(vec_npr)    # array([1.0, 2.0])