首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在cython中调用此函数?

如何在cython中调用此函数?
EN

Stack Overflow用户
提问于 2012-01-10 01:03:06
回答 2查看 1.3K关注 0票数 5

在只有numpy的cython中调用此函数的最佳方法是什么?我不打算使用ctype,memcpy,malloc等等。

职能1)

代码语言:javascript
运行
复制
#include <stdio.h>
extern "C" void cfun(const void * indatav, int rowcount, int colcount,
void * outdatav);

void cfun(const void * indatav, int rowcount, int colcount, void *
outdatav) {
    //void cfun(const double * indata, int rowcount, int colcount,
double * outdata) {
    const double * indata = (double *) indatav;
    double * outdata = (double *) outdatav;
    int i;
    puts("Here we go!");
    for (i = 0; i < rowcount * colcount; ++i) {
        outdata[i] = indata[i] * 4;
    }
    puts("Done!");
}

职能2)

代码语言:javascript
运行
复制
#include <stdio.h>

extern "C" __declspec(dllexport) void cfun(const double ** indata, int
rowcount, int colcount, double ** outdata) {
    for (int i = 0; i < rowcount; ++i) {
        for (int j = 0; j < colcount; ++j) {
            outdata[i][j] = indata[i][j] * 4;
        }
    }
}

旺君湾

EN

回答 2

Stack Overflow用户

发布于 2012-01-24 18:51:09

您可以直接从Cython‘调用’函数,方法是将它声明为extern。

代码语言:javascript
运行
复制
cdef extern from "mylibraryheader.h":
    void cfun1(void* indatav, int rowcount, int colcount, void* outdatav)
    void cfun2(double** indata, int rowcount, int colcount, doubke** outdata)

您现在可以像在C/C++中那样调用这些函数。注意,Cython中没有const关键字,可以省略它。不幸的是,我不能给您一个示例,说明如何将NumPy数组转换为double数组。但是,这里有一个从双倍列表中运行它的例子。

代码语言:javascript
运行
复制
cdef extern from "mylibraryheader.h":
    void cfun1(void* indatav, int rowcount, int colcount, void* outdatav)
    void cfun2(double** indata, int rowcount, int colcount, double** outdata)

cdef extern from "stdlib.h":
    ctypedef int size_t
    void* malloc(size_t)
    void free(void*)

def py_cfunc1(*values):
    cdef int i = 0
    cdef int size = sizeof(double)*len(values)
    cdef double* indatav = <double*> malloc(size)
    cdef double* outdatav = <double*> malloc(size)
    cdef list outvalues = []
    for v in values:
        indatav[i] = <double>v
        i += 1
    cfun1(<void*>indatav, 1, len(values), <void*>outdatav)
    for 0 <= i < len(values):
        outvalues.append(outdatav[i])
    return outvalues

注:未经测试

票数 2
EN

Stack Overflow用户

发布于 2012-01-10 15:51:44

您不能从cython调用这个函数--您必须将它写成一个cython函数--一些好的例子是这里。作为参考,职能1):

代码语言:javascript
运行
复制
cimport numpy as np

def cfun(np.ndarray indata, int rowcount, int colcount, np.ndarray outdata):
    cdef int i
    print("Here we go!")
    for i in range(rowcount * colcount):
        outdata[i] = indata[i] * 4
    print("Done!")

如果您真的想调用它,您必须使用ctype或编写您自己的包装器。使用大口也是可行的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8797335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档