Python 如何将numpy数组转换为矢量<;int>&;(参考)带SWIG

Python 如何将numpy数组转换为矢量<;int>&;(参考)带SWIG,python,c++,numpy,vector,swig,Python,C++,Numpy,Vector,Swig,我的目标是: 在Python中创建3个NUMPY数组(其中2个将以特定值初始化),然后通过SWIG将所有三个都发送到C++函数中,作为vector 引用< /强>(这是为了避免复制数据和松动效率)。一旦进入C++函数,就添加2个数组,并将它们的总和放在第三个数组中。 向量参考h #include <vector> #include <iostream> void add_vec_ref(std::vector<int>& dst, std::vect

我的目标是:

在Python中创建3个NUMPY数组(其中2个将以特定值初始化),然后通过SWIG将所有三个都发送到C++函数中,作为vector <强>引用< /强>(这是为了避免复制数据和松动效率)。一旦进入C++函数,就添加2个数组,并将它们的总和放在第三个数组中。 向量参考h

#include <vector>
#include <iostream>

void add_vec_ref(std::vector<int>& dst, std::vector<int>& src1, std::vector<int>& src2);
tester.py

import vec_ref as vec
import numpy as np

a = np.array([1,2,3], dtype=np.intc)
b = np.array([4,5,6], dtype=np.intc)
c = np.zeros(len(a), dtype=np.intc)

print('---Before---\na:', a)
print('b:', b)
print('c:', c)

vec.add_vec_ref(c,a,b)

print('---After---\na:', a)
print('b:', b)
print('c:', c)
输出:

---Before---
a: [1 2 3]
b: [4 5 6]
c: [0 0 0]
Traceback (most recent call last):
  File "tester.py", line 12, in <module>
    vec.add_vec_ref(c,a,b)
TypeError: in method 'add_vec_ref', argument 1 of type 'std::vector< int,std::allocator< int > > &'
---之前---
答:[1 2 3]
b:[4 5 6]
c:[0]
回溯(最近一次呼叫最后一次):
文件“tester.py”,第12行,在
矢量添加矢量参考(c、a、b)
TypeError:在方法“add_vec_ref”中,参数1的类型为“std::vector&”
我已经尝试了在vec_ref.I中找到的所有注释掉的%apply和%template指令,但它们都不起作用


是否有一些我不应该包含的类型映射?

我同意@pschill:不复制数据就不可能获得std::vector

一种替代方法是使用(在C++20中引入)或库中定义的类似
span
类模板

创建<代码> STD::SpAs/Cuth>将提供一个在 NoMPy数组中的现有数据视图,并在C++中提供(如代码>操作程序[]/COD>,迭代器,<代码> Fror(<代码)>,<代码>后退()/代码>等)。p>


创建span永远不会复制numpy阵列中的数据。

您可以参考Facebook faiss库,它以更优雅的方式实现了您想要实现的目标,方法如下:

Python特定:NUMPY数组C++指针接口(vector)< /P>


您可以在其上看到代码。

这是不可能的。在C++中,只能创建对实际存在的对象的引用。但是,NUMPY数组不包含<代码> STD::vector < /代码>。相关:谢谢提供我所看到的最好的替代方案(除了构建我自己的类)。如果我真的想使用(和修改)一个STD::在我的C++函数中,没有复制的向量,我会有什么选择?指向std::vector的原始指针?共享到std::vector的ptr?@GabrielDevillers,如果我理解你的问题,如果存在一个向量,并且你想在函数中修改它,我建议使用对该向量的引用:
std::vector&v
@NicholasM我是说在一个API中,我想用SWIG包装它。我这么问是因为我知道SWIG不能将非常量引用包装成向量。哦,对不起。我建议你针对你的具体情况提出一个新问题。
all:
    rm -f *.so *.o *_wrap.* *.pyc *.gch vec_ref.py
    swig -c++ -python vec_ref.i
    g++ -O0 -g3 -fpic -c vec_ref_wrap.cxx vec_ref.h vec_ref.cpp -I/home/lmckeereid/tools/anaconda3/pkgs/python-3.7.3-h0371630_0/include/python3.7m/
    g++ -O0 -g3 -shared vec_ref_wrap.o vec_ref.o -o _vec_ref.so
import vec_ref as vec
import numpy as np

a = np.array([1,2,3], dtype=np.intc)
b = np.array([4,5,6], dtype=np.intc)
c = np.zeros(len(a), dtype=np.intc)

print('---Before---\na:', a)
print('b:', b)
print('c:', c)

vec.add_vec_ref(c,a,b)

print('---After---\na:', a)
print('b:', b)
print('c:', c)
---Before---
a: [1 2 3]
b: [4 5 6]
c: [0 0 0]
Traceback (most recent call last):
  File "tester.py", line 12, in <module>
    vec.add_vec_ref(c,a,b)
TypeError: in method 'add_vec_ref', argument 1 of type 'std::vector< int,std::allocator< int > > &'