包装C++;使用SWIG在Python中初始化 我有下面的C++类,我希望用SWIG在Python中包装。 typedef std::map<std::string, double> ParamaterSet; class GPRegressor{ public: double runRegression(const double *trainData, const double *trainTruth, int trainRows, int trainCols, const double *testData, const double *testTruth, int testRows, int testCols, const ParamaterSet &params); GPRegressor(KernelType kernType = SQUARED_EXPONENTIAL); ~GPRegressor(); };

包装C++;使用SWIG在Python中初始化 我有下面的C++类,我希望用SWIG在Python中包装。 typedef std::map<std::string, double> ParamaterSet; class GPRegressor{ public: double runRegression(const double *trainData, const double *trainTruth, int trainRows, int trainCols, const double *testData, const double *testTruth, int testRows, int testCols, const ParamaterSet &params); GPRegressor(KernelType kernType = SQUARED_EXPONENTIAL); ~GPRegressor(); };,python,c++,numpy,swig,Python,C++,Numpy,Swig,我相信我已经正确地编写了SWIG类型图,以允许我这样做。我已经编写了以下Python测试代码 #!/usr/bin/python3 import sys, os sys.path.append(os.path.realpath('../build')) import numpy as np from pyGP import * def runRegression(): X = np.random.rand(30, 2) Y = np.random.rand(30, 1)

我相信我已经正确地编写了SWIG类型图,以允许我这样做。我已经编写了以下Python测试代码

#!/usr/bin/python3
import sys, os
sys.path.append(os.path.realpath('../build'))
import numpy as np

from pyGP import *

def runRegression():
    X = np.random.rand(30, 2)
    Y = np.random.rand(30, 1)
    X_s = np.random.rand(30, 2)
    Y_s = np.random.rand(30, 1)

    regressor = GPRegressor()
    regressor.runRegression(X, Y, 30, 2, X_s, Y_s, 30, 1, {'a' : 0.0, 'b' : 0.0})

if __name__ == "__main__":
    runRegression()
但是,我收到了以下错误,这意味着我实际上在numpy数组的类型映射中犯了一个错误

Traceback (most recent call last):
  File "./demo.py", line 22, in <module>
    runRegression()
  File "./demo.py", line 18, in runRegression
    regressor.runRegression(X, Y, 30, 2, X_s, Y_s, 30, 1, {'a' : 0.0, 'b' : 0.0})
  File "/home/jack/GitRepos/GaussianProcess/build/pyGP.py", line 337, in runRegression
    return _pyGP.GPRegressor_runRegression(self, trainData, trainTruth, trainRows, trainCols, testData, testTruth, testRows, testCols, params)
TypeError: in method 'GPRegressor_runRegression', argument 2 of type 'double const *'
并已将要包装的函数的签名更改为以下内容:

%apply (double *IN_ARRAY2, int DIM1, int DIM2) {(const double *trainData, int trainCols, int trainRows)};
%apply (double *IN_ARRAY1, int DIM1) {(const double *trainTruth, int trainRows)};
%apply (double *IN_ARRAY2, int DIM1, int DIM2) {(const double *testData, int testCols, int testRows)};
%apply (double *IN_ARRAY1, int DIM1) {(const double *testTruth, int testRows)};
double runRegression(const double *trainData, int trainCols, int trainRows, const double *trainTruth,
                     int trainTruthRows, const double *testData, int testCols, int testRows,
                     const double *testTruth, int testTruthRows, const ParamaterSet &params);
以便参数的顺序与类型映射的顺序相匹配。但是,我仍然收到以下错误:

Traceback (most recent call last):
  File "./demo.py", line 23, in <module>
    runRegression()
  File "./demo.py", line 19, in runRegression
    regressor.runRegression(X, 2, 30, Y, 30, X_s, 2, 30, Y_s, 30, {'a' : 0.0, 'b' : 0.0})
TypeError: runRegression() takes 6 positional arguments but 12 were given
回溯(最近一次呼叫最后一次):
文件“/demo.py”,第23行,在
运行回归()
文件“/demo.py”,第19行,在runRegression中
运行回归(X,2,30,Y,30,X_-s,2,30,Y_-s,30,{'a':0.0,'b':0.0})
TypeError:runRegression()接受6个位置参数,但给出了12个

如果查看
numpy.i
标题中的示例,您将看到如何应用
numpy
类型映射的示例

在你的情况下,你应该改变

%apply (double *arr, int dim1, int dim2) {(double *data, int dimx, int dimy)}
进入


<> > < <代码> < NyARYA2 >使用

< P>我认为当你将NUMPY NDAREL提供给C++函数时,不应该添加你的nDayLaye维度信息,在你的例子中是:<代码> 2, 30, 30…< /Cord>
相反,只需提供如下参数:
regressor.runRegression(X,Y,X_-s,Y_-s,{'a':0.0,'b':0.0})

您的类型图应该看起来像
%apply(double*IN_-ARRAY2,int-DIM1,int-DIM2){(const-double*iData,int-dimx,int-dimy)}注意数组2中的
是如何used@Flexo它是。我会把它作为答案。嗨,谢谢你的回复。但是,在进行建议的更改后,我仍然收到相同的错误。我尝试过使用和不使用const限定符(因为我希望能够将一些numpy数组作为const传递,而将其他数组作为non-const传递)。参数名称
data
dimx
dimy
必须与头文件中的名称匹配。如果是函数
runRegression
,则必须将其命名为
trainRows
等。感谢您的帮助。我现在更新了我的问题,在实施了你的建议后,我现在的问题。谢谢。你需要重新排列你的论点。类型映射要求指定的参数彼此相邻。您在
const double*trainTruth
旁边有
const double*trainData
,这将不起作用。让您的参数保持成对,例如
常数双a*、大小双a*、常数双b*、大小双nb
…非常感谢您的帮助。我已经按照建议重新安排了参数,但似乎仍然缺少一些东西(更新的问题)。另外,有没有办法不复制函数签名中的维度,例如,如果我们有多个大小相同的numpy数组?再次感谢你。
%apply (double *arr, int dim1, int dim2) {(double *data, int dimx, int dimy)}
%apply (double* IN_ARRAY2, int DIM1, int DIM2) {(const double *testTruth, int testRows, int testColsdouble)};

%apply (double* IN_ARRAY2, int DIM1, int DIM2) {(const double *trainTruth, int trainRows, int trainCols)};