【问题标题】:How to pass a fortran ordered 2d numpy array into c++ using SWIG如何使用 SWIG 将 fortran 有序 2d numpy 数组传递到 C++
【发布时间】:2014-04-01 01:21:47
【问题描述】:

我有一个c++函数

myfun(double* array, int n1, int n2);

我在 python 中与 numpy 交互。在我的接口文件中,我有

%apply (double* INPLACE_FARRAY2, int DIM1, int DIM2) {(double* inarray, int n1, int n2)}

现在,我想在 python 中将数组 b = array([[3,27.0],[2,9],[10,1]],order='F') 传递给 myfun,但出现以下错误

TypeError: Array must be contiguous.  A non-contiguous array was given. 

我做错了什么?我的%apply 语句中的双精度数据类型不正确吗?

【问题讨论】:

    标签: python c++ arrays numpy swig


    【解决方案1】:

    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函数将写入数组,因此原始容器中的排序必须匹配。

    【讨论】:

    • 好主意,但没有奏效。我已经尝试了一段时间,除非我手动移动元素使其采用列优先格式,否则可能无法做到这一点。
    • @user1589038 有点不对劲,这是一个基本情况。您为连续数组尝试了什么?我有错误的语法,你试过的更新版本是什么?
    • 我通过将 ascontiguousarray(b) 传递给 myfun.但是,当我将 SWIG 接口更改为采用 IN_FARRAY2 而不是 INPLACE_FARRAY2 时,我可以简单地传递 b,它是 fortran 连续的。为什么会有差异?
    • user1589038 in 版本可以在没有ascontiguousarray 的情况下工作,我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多