Передача элемента массива numpy (int) в c ++ int с использованием SWIG - PullRequest
0 голосов
/ 23 октября 2019

Я бы хотел передать целочисленный элемент из массива numpy в python в функцию c ++, которая перехватывает его как целое число c ++ с помощью SWIG.

Чего мне здесь не хватает?

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), Я скопировал пифрагментыФайл .swg в мой рабочий каталог, но ничего не изменилось.

Я также попробовал несколько директив% apply для передачи int и int *, но это еще ничего не изменило. получая ту же ошибку TypeError, которую я перечислил выше.

Версии: numpy 1.17.3; swig 2.0.12; python 3.7.3; numpy.i копируется в мой рабочий каталог с: /usr/lib/python2.7/dist-packages/instant/swig/numpy.i

1 Ответ

1 голос
/ 25 октября 2019

Решено! Было 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 в рабочий каталог вашего проекта.

По умолчанию numpy создает целые числа типа long. Итак, в файле tester.py , мне нужно было написать: a = np.array ([1,2,3], dtype = np.intc)

Необходимо преобразовать numpy int в c ++ int в add_vector.i . Это можно сделать с помощью директивы% apply прямо над строкой% include "add_vector.h": % apply (int DIM1) {(int x)};

...