相关疑难解决方法(0)

正确的方法将numpy.matrix转换为C双指针

将numpy矩阵作为参数传递给C函数采用双指针的规范方法是什么?

上下文:我numpy用来验证一些C代码 - 我有一个C函数需​​要一个 const double ** const,我ctypes用来调用.soPython.

我试过了:

func.argtypes = ctypeslib.ndpointer(dtype=double, ndim=2, flags="C_CONTIGUOUS")
Run Code Online (Sandbox Code Playgroud)

numpy直接传递矩阵(不起作用),以及

func.argtypes = ctypes.POINTER(ctypes.POINTER(ctypes.c_double))
Run Code Online (Sandbox Code Playgroud)

然后numpy通过各种演员表传递矩阵.Casting导致了Python错误

TypeError: _type_ must have storage info
Run Code Online (Sandbox Code Playgroud)

注意:这个问题在几年前出现在这里,但没有完全成功的解决方案.

c python numpy matrix

9
推荐指数
1
解决办法
1912
查看次数

如何在Cython中动态声明2D c数组

我需要使用各种大小的2D numpy数组执行大量工作,我想将这些计算卸载到cython上.我的想法是我的2D numpy数组将从python传递到cython,在那里它将转换为c-array或内存视图,并用于其他c级函数的级联中进行计算.

经过一些分析后,由于一些严重的python开销,我排除了在cython中使用numpy数组.使用内存视图更快,更容易使用,但我怀疑我可以使用c-arrays进一步加速.

这是我的问题 - 我怎样才能在cython中声明一个2D c-array而不用设定值预定义它的尺寸?例如,我可以通过这种方式从numpy创建一个c-array:

narr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]], dtype=np.dtype("i"))

cdef int c_arr[3][4]:
for i in range(3):
    for j in range(4):
        c_arr[i][j] = narr[i][j]
Run Code Online (Sandbox Code Playgroud)

然后将其传递给函数:

cdef void somefunction(int c_Arr[3][4]):
    ...
Run Code Online (Sandbox Code Playgroud)

但这意味着我有一个固定的数组sizde,在我的情况下将是无用的.所以我尝试过这样的事情:

narr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]], dtype=np.dtype("i"))

cdef int a = np.shape(narr)[0]
cdef int b = np.shape(narr)[1]

cdef int c_arr[a][b]:               # INCORRECT - EXAMPLE ONLY

for i in range(a):
    for j in range(b):
        c_arr[i][j] = narr[i][j]
Run Code Online (Sandbox Code Playgroud)

打算将它传递给这样的函数:

cdef void somefunction(int a, int b, int c_Arr[a][b]):
    ...
Run Code Online (Sandbox Code Playgroud)

但它不起作用,编译失败,错误"不允许在常量表达式中".我怀疑我需要以某种方式使用malloc/free吗?我看了一下这个问题(如何在Cython中声明2D列表),但它没有提供我的问题的答案.

更新: …

c numpy cython dynamic-arrays memoryview

6
推荐指数
1
解决办法
6503
查看次数

标签 统计

c ×2

numpy ×2

cython ×1

dynamic-arrays ×1

matrix ×1

memoryview ×1

python ×1