gpt4 book ai didi

python - 将一组 NumPy 数组传递给 C 函数以进行输入和输出

转载 作者:太空狗 更新时间:2023-10-29 17:48:39 25 4
gpt4 key购买 nike

假设我们有一个 C 函数,它接受一组一个或多个输入数组,处理它们,并将其输出写入一组输出数组。签名如下所示(count 表示要处理的数组元素的数量):

void compute (int count, float** input, float** output)

我想通过 ctypes 从 Python 调用此函数,并使用它对一组 NumPy 数组应用转换。对于定义为的单输入/单输出函数

void compute (int count, float* input, float* output)

以下作品:

import ctypes
import numpy

from numpy.ctypeslib import ndpointer

lib = ctypes.cdll.LoadLibrary('./block.so')
fun = lib.compute
fun.restype = None
fun.argtypes = [ctypes.c_int,
ndpointer(ctypes.c_float),
ndpointer(ctypes.c_float)]

data = numpy.ones(1000).astype(numpy.float32)
output = numpy.zeros(1000).astype(numpy.float32)
fun(1000, data, output)

但是,我不知道如何为多个 输入(和/或输出)创建相应的指针数组。有什么想法吗?

编辑:所以人们一直想知道compute 是如何知道有多少个数组指针(因为count 指的是每个元素的数量大批)。实际上,这是硬编码的;一个给定的 compute 准确地知道预期有多少输入和输出。验证 inputoutput 是否指向正确数量的输入和输出是调用者的工作。下面是一个 compute 示例,它接受 2 个输入并写入 1 个输出数组:

virtual void compute (int count, float** input, float** output) {
float* input0 = input[0];
float* input1 = input[1];
float* output0 = output[0];
for (int i=0; i<count; i++) {
float fTemp0 = (float)input1[i];
fRec0[0] = ((0.09090909090909091f * fTemp0) + (0.9090909090909091f * fRec0[1]));
float fTemp1 = (float)input0[i];
fRec1[0] = ((0.09090909090909091f * fTemp1) + (0.9090909090909091f * fRec1[1]));
output0[i] = (float)((fTemp0 * fRec1[0]) - (fTemp1 * fRec0[0]));
// post processing
fRec1[1] = fRec1[0];
fRec0[1] = fRec0[0];
}
}

我无法影响compute 的签名和实现。我可以(通过 Python!)验证需要多少输入和输出。关键问题是如何为函数提供正确的 argtypes,以及如何在 NumPy 中生成适当的数据结构(指向 NumPy 数组的指针数组)。

最佳答案

要专门针对 Numpy 数组执行此操作,您可以使用:

import numpy as np
import ctypes

count = 5
size = 1000

#create some arrays
arrays = [np.arange(size,dtype="float32") for ii in range(count)]

#get ctypes handles
ctypes_arrays = [np.ctypeslib.as_ctypes(array) for array in arrays]

#Pack into pointer array
pointer_ar = (ctypes.POINTER(C.c_float) * count)(*ctypes_arrays)

ctypes.CDLL("./libfoo.so").foo(ctypes.c_int(count), pointer_ar, ctypes.c_int(size))

事物的 C 端可能看起来像:

# function to multiply all arrays by 2
void foo(int count, float** array, int size)
{
int ii,jj;
for (ii=0;ii<count;ii++){
for (jj=0;jj<size;jj++)
array[ii][jj] *= 2;
}

}

关于python - 将一组 NumPy 数组传递给 C 函数以进行输入和输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14341549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com