首页 > 解决方案 > 用于多个不同类型数组的 Numpy.i 类型映射

问题描述

我有一个 C 函数,除其他参数外,它还包含 3 个不同类型的数组: void create_signal(double ztab[], ..., int *pdata, ..., char ranging[], ...);我想在使用 SWIG 的 Python 模块中使用这个函数。

我已经想出了如何使用 C 函数来接收带有numpy.i类型映射的数组: %apply (double* INPLACE_ARRAY1, int DIM1) {(double xtab[], int length)}例如,

甚至2个相同类型的数组: apply (double* INPLACE_ARRAY1, int DIM1) {(double xtab[], int length_x), (double ytab[], int length_y)}

但我不知道如果数组是不同的类型(在我的情况下int,,,doublechar),或者我是否应该重写我自己的类型映射,是否可以这样做。

谢谢你的帮助 !

标签: pythonarrayscswigtypemaps

解决方案


无论如何,这里有一个例子

测试.h

#pragma once

void multipleInputs(const float* data, const int nData,
                    const float* pos, const int nPositions, const int nDim);

测试.cpp

#include "test.h"

#include <cstdio>

void multipleInputs(const float* data, const int nData,
                    const float* pos, const int nPositions, const int nDim)
{
  if (nData > 0) {
    printf("%d'th element is: %f\n", (nData-1), data[nData-1]);
  }
  if ((nDim > 0) && (nPositions > 0)){
    printf("%d'th dimension of the %d'th element is: %f\n",
           (nDim-1), (nPositions-1), data[nData-1]);
  }
}

测试.i

%module example
%{
  #define SWIG_FILE_WITH_INIT
  #include "test.h"
%}

%include "numpy.i"

%init {
  import_array();
}

%apply (float* IN_ARRAY1, int DIM1) \
{(const float* data, const int nData)}

%apply (float* IN_ARRAY2, int DIM1, int DIM2) \
{(const float* pos, const int nPositions, const int nDim)};

%include "test.h"

安装程序.py

import numpy

from setuptools import setup, Extension

setup(name="example",
      py_modules=["example"],
      ext_modules=[Extension("_example",
                             ["test.i","test.cpp"],
                             include_dirs = [numpy.get_include(), '.'],
                             swig_opts=['-c++', '-I.'],
      )]
)

测试.py

import example
example.multipleInputs(np.ones((10),dtype=np.float32), 
                       np.ones((10,10),dtype=np.float32))

推荐阅读