gpt4 book ai didi

python - 在 cython 中创建 2D/3D C 数组

转载 作者:行者123 更新时间:2023-12-01 05:02:05 25 4
gpt4 key购买 nike

谁能告诉我如何将 cython 创建的二维数组传递给 cdef 函数?我可以用一维数组做到这一点,但是不是 2D(或更高),让我说明一下情况:

这是我想在 cython 中重现的 C 代码:

#include <stdio.h>

void print_my_1Darray();
void print_my_2Darray();

int main(void){

int arr1D[] = {1,2,3,4,5,6,7,8,9,10,11,12};
int arr2D[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

print_my_1Darray(arr1D);
printf("\n");
print_my_2Darray(arr2D);
printf("\n");
return 0;
}

void print_my_1Darray( int x[] ){

int i;
for(i=0; i < 12; i++){
printf("c[%d] = %d\n",i, x[i]);
}
}

void print_my_2Darray( int x[3][4] ){

int i, j;
for(i=0; i < 3; i++){
for(j=0; j < 4; j++){
printf("c[%d][%d] = %d\n",j, i, x[i][j]);
}
}
}

然后,如果我尝试在 Cython 中重现此内容,如下所示:

cimport cython
import numpy as np
cimport numpy as cnp

def testfunc():

cdef int *arr1D = [1,2,3,4,5,6,7,8,9,10,11,12]
print_my_1D_array(arr1D)

cdef int *arr2D = [[1,2,3,4], [5,6,7,8], [9,10,11,12]] # <-- WRONG!
print_my_2D_array(arr2D)


cdef void print_my_1D_array(int c_arr[12]):

cdef int i

for i in range(4):
print c_arr[i]

cdef void print_my_2D_array(int c_arr[3][4]):

cdef int i, j

for i in range(3):
for j in range(4):
print c_arr[i][j]

当我编译这个 pyx 脚本时,我收到错误:

    cdef int *arr2D = [[1,2,3,4][5,6,7,8][9,10,11,12]]   
print_my_2D_array(arr2D)
^
------------------------------------------------------------

test2.pyx:18:27: Cannot assign type 'int *' to 'int (*)[4]'

看来我可以用它来创造一些东西

  "cdef int *arr2D = [[1,2,3,4][5,6,7,8][9,10,11,12]]" 

line 并且编译正常,直到我尝试将它传递给函数或简单地打印它的成员...

任何人都可以解释那里发生了什么以及如何在 cython 中创建纯 C 2D/3D 数组以及如何将它们传递给 C 级函数吗?另外,我试图避免使用 numpy 数组以避免 python 开销,因为我的代码需要对数组进行非常快速的计算。

最佳答案

您需要使输入数组静态:

cdef int arr2D[3][4]
arr2D[0][:] = [1, 2, 3, 4]
arr2D[1][:] = [5, 6, 7, 8]
arr2D[2][:] = [9, 10, 11, 12]

关于python - 在 cython 中创建 2D/3D C 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25873516/

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