Спасибо, пытаюсь понять по ссылке что делать :-)
doza_and
А как вы используете myfunct?
Вот эта схема позволила избавиться от Питон циклов, там где очень трудно построить матричное выражение:
void test_funct(const int n, const double* x, double* out){
int i;
double cx ;
for(i=0; i<n; ++i){
cx = *(x++);
*(out++) = 2.*cx;
}
}
def test_funct(t):
res = ndarray(t.shape,dtype='d')
n = t.shape[0]
test.test_funct(n,t.reshape(-1,1).ctypes.data,res.reshape(-1,1).ctypes.data)
return res
t=numpy.linspace(0,1,10);
R=test_funct(t)
но теперь проблема в том, что в Си функции нужно вызывать специальные функции, ну например нужно вместо 2*x вызвать scipy.special.j0(x), пока не понял можно ли это сделать
пока не очень хороший резутьтат:
void test_funct(const int n, const double* x, double* out, double(*fp)(double)){
int i;
double cx ;
for(i=0; i<n; ++i){
cx = *(x++);
*(out++) = fp(cx);
}
}
CMPFUNC = CFUNCTYPE(c_double)
def test_funct(t):
res = ndarray(t.shape,dtype='d')
n = t.shape[0]
test.test_funct(n,t.reshape(-1,1).ctypes.data,res.reshape(-1,1).ctypes.data,CMPFUNC(scipy.special.j0))
return res
./test.py
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 295, in 'calling callback function'
ValueError: invalid number of arguments
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 295, in 'calling callback function'
ValueError: invalid number of arguments
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 295, in 'calling callback function'
ValueError: invalid number of arguments
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 295, in 'calling callback function'
ValueError: invalid number of arguments
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 295, in 'calling callback function'
...