首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cython内存视图:用数组参数包装c函数以传递numpy数组

Cython内存视图:用数组参数包装c函数以传递numpy数组
EN

Stack Overflow用户
提问于 2016-04-08 15:42:38
回答 1查看 1.1K关注 0票数 2

我试图使用Cython将c函数包装为一个数组参数(quick_sort()),这样我就可以向它传递一个numpy数组。我已经搜索了文档,所以和网络寻找一个有用的,最小的例子,但没有找到它。我尝试过几种可能性,但没有取得任何进展,所以请帮助我找出答案。这是我的档案:

quicksort.c

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

void quick_sort (int* a, int n) {
    int i, j, p, t;
    if (n < 2)
        return;
    p = a[n / 2];
    for (i = 0, j = n - 1;; i++, j--) {
        while (a[i] < p)
            i++;
        while (p < a[j])
            j--;
        if (i >= j)
            break;
        t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
    quick_sort(a, i);
    quick_sort(a + i, n - i);
}

quicksort.h

代码语言:javascript
运行
复制
void quick_sort (int* a, int n);

quicksort.pxd

代码语言:javascript
运行
复制
cdef extern from "quicksort.h":
    void quick_sort (int[:] a, int n)

cy_quicksort.pyx

代码语言:javascript
运行
复制
cimport quicksort

def quicksort_c(int[:] a):
    quicksort.quick_sort(a, a.size)

setup.py

代码语言:javascript
运行
复制
from distutils.core import setup
from Cython.Build import cythonize

setup(
    name='quicksort cython',
    ext_modules=cythonize("*.pyx"),
)

当我运行python setup.py build_ext --inplace命令时,它返回以下错误:

代码语言:javascript
运行
复制
cy_quicksort.c:1362:14: error: passing '__Pyx_memviewslice' to parameter of
      incompatible type 'int *'
  quick_sort(__pyx_v_a, __pyx_t_3);
             ^~~~~~~~~
./quicksort.h:1:23: note: passing argument to parameter 'a' here
void quick_sort (int* a, int n);

我想要实现的是编译它并能够运行,例如:

代码语言:javascript
运行
复制
import numpy as np
from cy_quicksort import quicksort_c
a = np.array(range(9, 0, -1), dtype=np.int32)
quicksort_c(a)

提前谢谢你的时间!

编辑:

quicksort.pxdcy_quicksort.pyx中的DavidW建议进行更改并将setup.py文件更改为以下形式后,它将按预期工作。

setup.py

代码语言:javascript
运行
复制
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension

sourcefiles = ['cy_quicksort.pyx', 'quicksort.c']

extensions = [Extension("cy_quicksort", sourcefiles)]

setup(
    ext_modules = cythonize(extensions)
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-08 17:11:58

问题主要出现在"quicksort.pxd“中--定义需要与Quicksort.h中的定义相匹配:

代码语言:javascript
运行
复制
cdef extern from "quicksort.h":
    void quick_sort (int* a, int n)

([:]将其定义为内存视图,这是Cythony的发明,不能像您的错误说的那样直接转换到指针)。

然后,您需要从"cy_quicksort.pyx“中的内存视图中获取一个指针。

代码语言:javascript
运行
复制
def quicksort_c(int[::1] a):
    quicksort.quick_sort(&a[0], a.size) # get address of first element

我已经将输入参数更改为[::1],以指定元素在内存中必须是连续的,我认为这正是quicksort所期望的。

(注:未经测试,但相当简单,应该有效!)

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

https://stackoverflow.com/questions/36503828

复制
相关文章

相似问题

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