【问题标题】:Accessing a int16 array using numpy.i and swig使用 numpy.i 和 swig 访问 int16 数组
【发布时间】:2015-05-12 21:58:46
【问题描述】:

c 结构中的以下内容已用 swig 包装,以便我可以在 python 中访问从另一个 swig 包装程序获取的数据。

struct RadarParm {
  struct {
    char major;
    char minor;
  } revision;

  struct {
   char code;
   char *time;
   char *command;
  } origin;

  int16 cp;
  int16 stid;
  int16 *pulse;
  int16 *lag[2]; 
  char *combf;
};

我的主要问题是 int16 *lag[2]。当试图读取我的 python 代码中的数据时:

p_data['lag'] = prm.lag

其中 prm 是通过 struct RadarParm* getRadarParm() 方法从 rtserver.c 文件返回的 RadarParm 类型,而 p_data 是存储 RadarParm 各个部分的 Python 字典。

这是我在访问 prm.lag 时的当前输出:

<Swig Object of type 'int16 **' at 0x1fd55d0>

我发现似乎有一个 numpy.i 文件可以处理数组和 int16 数据类型。根据我有限的理解,我认为这将允许我访问这些数据。如果我能正确实现它。

这是我目前所拥有的:

%init %{
    import_array();
%}

%apply (int16** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1) {(int16* lag,2)};

编译时我得到:

Error: Syntax error in input(1).

关于如何进行这项工作的任何想法?

【问题讨论】:

    标签: python c numpy swig


    【解决方案1】:

    在这种情况下 numpy.i 不起作用。主要问题是 numpy.i 不支持 (out) 类型映射,在这种情况下,这正是我所需要的。

    在编译 swig rtserver.i 文件时使用命令 -debug-tmsearch。使用命令的输出,我能够确定 RadarParm::lag 定义的 swig 类型以及它应该是什么。这是有效的代码。

    %typemap(out) int16*[2] {
      int i;
      $result = PyList_New(2);
      for (i = 0; i < 2; i++) {
        PyObject *o = PyInt_FromLong($1[i]);
        PyList_SetItem($result,i,o);
      }
    }
    %apply int16*{lag[2]};
    

    大部分内容来自this answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      相关资源
      最近更新 更多