来自Cython中动态数组的2D MemoryView

问题描述 投票:1回答:2

我知道这个question,但我正在寻找一种更简单的方法来从C数组生成2d内存视图。由于我是C和Cython的noobie,有人可以请解释一下为什么

cdef int[:, :] get_zeros(int d):
    # get 2-row array of zeros with d as second dimension
    cdef int i
    cdef int *arr = <int *> malloc(sizeof(int) * d)
    for i in range(d):
        arr[i] = 0
    cdef int[:, :] arr_view
    arr_view[0, :] = <int[:d]>arr
    arr_view[1, :] = <int[:d]>arr
    return arr_view

不起作用?

[编译时,我得到Cannot assign type 'int[::1]' to 'int'作为错误。这是否意味着2d内存视图被第一个Assign语句折叠到1d,还是因为memoryview需要连续的块等?

我知道这个问题,但是我正在寻找一种更简单的方法来从C数组生成2d内存视图。由于我是C和Cython的新手,所以有人可以解释一下为什么cdef int [:,...

python memory memory-management cython memoryview
2个回答
2
投票

显然,“解释为什么某事不起作用”非常困难,因为最终这只是一个设计决定,可以采取不同的方式。但是:


1
投票

除了@DavidW提供的精彩答案之外,我还想添加更多信息。在您包含的代码中,我看到您正在分配一个int数组,然后在for循环中将内容清零。实现此目的的更方便的方法是改为使用C的calloc函数,该函数可以保证指向零位内存的指针,并且此后不需要for循环。

© www.soinside.com 2019 - 2024. All rights reserved.