c - 带有 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]
这是正确的方法吗?
解决方案
你能做的是以下。
零酷变种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})
推荐阅读
- javascript - Next Js - Providers/getProviders() - FetchError - 下一个构建
- python - 如何排除 .dat 文件中的第一行?
- django - 如何将强化学习算法与 Firebase 集成?
- android - 如何将按钮对齐到屏幕底部?[扑]
- ms-word - 获取正在使用的 Office 版本
- android - 如何在Android中收集多个状态流
- c++ - 如何在 c++ winform 中同时运行两个函数?
- java - 如何使用 vertx-mongo 客户端执行 find(id : { $in : [ list ] } )
- c# - Nuget 不再识别 assemblyinfo.cs 版本
- java - 如何使用 Mono/Flux 返回类型加载测试方法?