H. *_*nen 5 python pointers numpy cython
我需要初始化可变 shape 数组(dim,) + (nbins,)*dim,其中 dim 通常很小,但 nbins 可以很大,因此数组具有 ndims = dim + 1。例如,如果dim = 1我需要一个 shape 数组(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)
Run Code Online (Sandbox Code Playgroud)
是的,我有预感它行不通,但无论如何都必须尝试;)
有可能做这样的事情还是我必须使用指针/内存分配等?或者我必须(大口大口!)只使用一维数组并在最后重塑它?
或者我是否必须(吞咽!)只使用一维数组并在最后重新调整它的形状?
恐怕你会的。如果在编译时已知维数,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)
Run Code Online (Sandbox Code Playgroud)
(旁注:形状的正确类型是np.npy_intp,而不是uint32_t。)