Cython + Numpy 变量 ndim 是什么意思?

5
我需要初始化变量形状的数组 (dim,) + (nbins,)*dim,其中dim通常很小,但nbins可能很大,因此数组具有ndims = dim + 1。例如,如果dim = 1,则需要一个形状为(1, nbins)的数组,如果dim = 2,则形状为(2, nbins, nbins)等。
是否可以相应地键入numpy数组?我尝试了一些东西。
 ctypedef uint32_t  uint_t
 ctypedef float     real_t
 ...
     cdef:
         uint_t dim = input_data.shape[1]
         np.ndarray[real_t, ndim=dim+1] my_array = np.zeros((dim,)\
     + (nbins,)*dim, dtype = np.float32)

是的,我本来就有预感它不会起作用,但还是尝试了一下 ;)

是否可以像这样做,还是必须使用指针/内存分配等?或者我只能(咽口气!)使用一维数组,在最后重新调整形状?

1个回答

3

那你只能使用一维数组,并在最后进行重塑。Cython只能在编译时知道维数,才能进行其数组访问优化。不要去改变malloc,这是没有价值的。


cdef:
    np.npy_intp size = dim * n_bins ** dim
    np.ndarray[float, ndim=1, mode='c'] arr = np.zeros(size, dtype=np.float32)

    # do work, using "manual" index calculations

    return arr.reshape(dim, (n_bins,) * dim)

(旁注:形状的适当类型是np.npy_intp,而不是uint32_t。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接