c python 传参数 数组_python – 使用cython将numpy数组列表传递给C.

我有一个列表list_of_arrays的3D numpy数组,我想用模板传递给C函数

int my_func_c(double **data, int **shape, int n_arrays)

这样的

data[i] : pointer to the numpy array values in list_of_arrays[i]

shape[i] : pointer to the shape of the array in list_of_arrays[i] e.g. [2,3,4]

如何使用cython接口函数调用my_func_c?

我的第一个想法是做类似下面的事情(有效),但我觉得有一个更好的方法就是使用numpy数组而不需要mallocing和freeing.

# my_func_c.pyx

import numpy as np

cimport numpy as np

cimport cython

from libc.stdlib cimport malloc, free

cdef extern from "my_func.c":

double my_func_c(double **data, int **shape, int n_arrays)

def my_func(list list_of_arrays):

cdef int n_arrays = len(list_of_arrays)

cdef double **data = malloc(n_arrays*sizeof(double *))

cdef int **shape = malloc(n_arrays*sizeof(int *))

cdef double x;

cdef np.ndarray[double, ndim=3, mode="c"] temp

for i in range(n_arrays):

temp = list_of_arrays[i]

data[i] = &temp[0,0,0]

shape[i] = malloc(3*sizeof(int))

for j in range(3):

shape[i][j] = list_of_arrays[i].shape[j]

x = my_func_c(data, shape, n_arrays)

# Free memory

for i in range(n_arrays):

free(shape[i])

free(data)

free(shape)

return x

注:

要查看一个工作示例,我们可以使用一个非常简单的函数来计算列表中所有数组的乘积.

# my_func.c

double my_func_c(double **data, int **shape, int n_arrays) {

int array_idx, i0, i1, i2;

double prod = 1.0;

// Loop over all arrays

for (array_idx=0; array_idx

for (i0=0; i0

for (i1=0; i1

for (i2=0; i2

prod = prod*data[array_idx][i0*shape[array_idx][1]*shape[array_idx][2] + i1*shape[array_idx][2] + i2];

}

}

}

}

return prod;

}

创建setup.py文件,

# setup.py

from distutils.core import setup

from Cython.Build import cythonize

import numpy as np

setup(

name='my_func',

ext_modules = cythonize("my_func_c.pyx"),

include_dirs=[np.get_include()]

)

python3 setup.py build_ext --inplace

最后我们可以进行一个简单的测试

# test.py

import numpy as np

from my_func_c import my_func

a = [1+np.random.rand(3,1,2), 1+np.random.rand(4,5,2), 1+np.random.rand(1,2,3)]

print('Numpy product: {}'.format(np.prod([i.prod() for i in a])))

print('my_func product: {}'.format(my_func(a)))

运用

python3 test.py

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值