首页 > 解决方案 > 带有 swig 映射的 numpy 数组

问题描述

我的函数包含 3 个一维数组参数和一个长度参数。例如:

float my_func(int *arr1, int *arr2, int *arr3, int length)

这个数组将是 IN_ARRAY 并且需要为它编写 swig 包装,所以从 swig 的文档中,我发现

DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]

这是正确的方法吗?

标签: cnumpyswig

解决方案


你能做的是以下。

零酷变种i

%module zerocool
%{
  #define SWIG_FILE_WITH_INIT
  #include "zerocool.h"
%}

#ifdef SWIGPYTHON
%include "numpy.i"
%init {
  import_array();
 }
#endif

%apply (int* IN_ARRAY1, int DIM1) \
{(int* arr1, int len1)}
%apply (int* IN_ARRAY1, int DIM1) \
{(int* arr2, int len2)}
%apply (int* IN_ARRAY1, int DIM1) \
{(int* arr2, int len2)}

%inline %{
  float my_func(int *arr1, int len1,
                int *arr2, int len2,
                int *arr3, int len3) {
    return my_func(arr1, arr2, arr3, len3);
  }
%}

你原来的标题,说 zerocool.h

#pragma once

float my_func(int *arr1, int *arr2, int *arr3, int length);

你的来源,说 zerocool.cpp

#include "zerocool.h"

#include "stdio.h"

float my_func(int *arr1, int *arr2, int *arr3, int length) {
  printf("Function is called\n");
  // Do some work on your input data
  return 0.0f;
}

示例 CMakeLists.txt 文件

cmake_minimum_required(VERSION 3.0)

find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})

set(Python_ADDITIONAL_VERSIONS 3.5 3.6 3.7)
find_package(PythonInterp 3 REQUIRED)
find_package(PythonLibs)

include_directories(${PYTHON_INCLUDE_PATH})
include_directories(${CMAKE_CURRENT_SOURCE_DIR})

set_property(SOURCE zerocool.i PROPERTY SWIG_FLAGS "-D_SWIG_WIN32")
set_source_files_properties(zerocool.i PROPERTIES CPLUSPLUS ON)

swig_add_library(zerocool LANGUAGE python SOURCES zerocool.i zerocool.cpp)
swig_link_libraries(zerocool ${PYTHON_LIBRARIES})

推荐阅读