使用 SWIG 将 numpy 数组元素(int)传递给 c++ int

Passing numpy array element (int) to c++ int using SWIG

我想将整数元素从 python 中的 numpy 数组传递给 c++ 函数,该函数使用 SWIG 将其捕获为 c++ 整数。

我在这里错过了什么?

add_vector.i

%module add_vector
%{
    #define SWIG_FILE_WITH_INIT
    #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION  // gets rid of warning
    #include "add_vector.h"
%}

%include "numpy.i"
%init %{
import_array();
%}

%include "add_vector.h"

add_vector.h

#include <iostream>

void print_int(int x);

add_vector.cpp

#include "add_vector.h"

void print_int(int x) {
    std::cout << x << std::endl;
}

tester.py

import add_vector as vec
import numpy as np

a = np.array([1,2,3])
print(a[1])
vec.print_int(a[1])

输出

2
Traceback (most recent call last):
  File "tester.py", line 6, in <module>
    vec.print_int(a[1])
TypeError: in method 'print_int', argument 1 of type 'int'

阅读 numpy.i 手册 (https://docs.scipy.org/doc/numpy-1.13.0/reference/swig.interface-file.html#numpy-array-scalars-and-swig),我将 pyfragments.swg 文件复制到我的工作目录中,但没有任何改变。

我还尝试了一些用于传递 int 和 int * 的 %apply 指令,但这并没有改变任何东西。我不断收到上面列出的相同 TypeError。

版本:numpy 1.17.3; 痛饮 2.0.12 ; python 3.7.3 ; numpy.i 正在从以下位置复制到我的工作目录:/usr/lib/python2.7/dist-packages/instant/swig/numpy.i

已解决!有 3 个问题:

  1. 我复制过来的numpy.i文件不兼容,通过anaconda的时候安装包里没有兼容的版本(还是不行)确定他们为什么要那样做)。

答案:找到你的numpy版本运行,然后到这里(https://github.com/numpy/numpy/releases)下载numpy-[your_version.zip 文件,然后专门复制 numpy.i 文件,在 numpy-[your_version]/tools/swig/ 中找到。现在将 numpy.i 粘贴到您的项目工作目录中。

  1. 默认情况下,numpy 生成 long 类型的整数。所以 在 tester.py 文件中,我需要写: a = np.array([1,2,3], dtype=np.intc)

  2. 需要将 numpy int 转换为 c++ int in add_vector.i。这可以通过使用 %include "add_vector.h" 行上方的 %apply 指令来完成:%apply (int DIM1) {(int x)};