我有一个c++的函数
myfun(double* array, int n1, int n2);
我在 python 中与 numpy 交互。在我的接口(interface)文件中,我有
%apply (double* INPLACE_FARRAY2, int DIM1, int DIM2) {(double* inarray, int n1, int n2)}
现在,我想将数组 b = array([[3,27.0],[2,9],[10,1]],order='F')
传递给 myfun在 python 中,但出现以下错误
TypeError: Array must be contiguous. A non-contiguous array was given.
我做错了什么?我的%apply
语句中的double数据类型不正确吗?
最佳答案
Fortran 顺序 (order='F') 可能是问题所在,因为这与 C 顺序相反,我不确定,因为我无法为 numpy 找到连续与非连续的明确定义。所以可能值得一试:
b = array([[3,27.0],[2,9],[10,1]],order='C')
另外,可能值得一试
myfun( numpy.ascontiguousarray(b) )
我找到了 numpy swig reference doc有助于理解 INPLACE_
和 IN_
类型映射之间的区别。基本上后者是在 c 函数只读不写时使用的,因为长输入是某种序列,SWIG 代码将能够处理它。前者表示 c 函数将写入数组,因此原始容器中的顺序必须匹配。
关于python - 如何使用 SWIG 将 Fortran 有序 2d numpy 数组传递到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22775154/