Cython + Numpy变量ndim?

时间:2014-12-16 21:43:29

标签: python pointers numpy cython

我需要初始化变量形状(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)

是的,我有预感它不行,但不得不尝试;)

是否可以做这样的事情或者我必须使用指针/内存分配等?或者我必须(gulp!)只使用一维数组并在最后重塑它?

1 个答案:

答案 0 :(得分:2)

  

或者我必须(gulp!)只使用一维数组并在最后重塑它?

我怕你这样做。如果在编译时已知维数,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。)