使用Cython,有没有办法编写快速通用函数,这些函数适用于具有不同维数的数组?例如对于去混叠功能,这个简单的例子:通用函数迭代n-D数组
import numpy as np
cimport numpy as np
ctypedef np.uint8_t DTYPEb_t
ctypedef np.complex128_t DTYPEc_t
def dealiasing1D(DTYPEc_t[:, :] data,
DTYPEb_t[:] where_dealiased):
"""Dealiasing data for 1D solvers."""
cdef Py_ssize_t ik, i0, nk, n0
nk = data.shape[0]
n0 = data.shape[1]
for ik in range(nk):
for i0 in range(n0):
if where_dealiased[i0]:
data[ik, i0] = 0.
def dealiasing2D(DTYPEc_t[:, :, :] data,
DTYPEb_t[:, :] where_dealiased):
"""Dealiasing data for 2D solvers."""
cdef Py_ssize_t ik, i0, i1, nk, n0, n1
nk = data.shape[0]
n0 = data.shape[1]
n1 = data.shape[2]
for ik in range(nk):
for i0 in range(n0):
for i1 in range(n1):
if where_dealiased[i0, i1]:
data[ik, i0, i1] = 0.
def dealiasing3D(DTYPEc_t[:, :, :, :] data,
DTYPEb_t[:, :, :] where_dealiased):
"""Dealiasing data for 3D solvers."""
cdef Py_ssize_t ik, i0, i1, i2, nk, n0, n1, n2
nk = data.shape[0]
n0 = data.shape[1]
n1 = data.shape[2]
n2 = data.shape[3]
for ik in range(nk):
for i0 in range(n0):
for i1 in range(n1):
for i2 in range(n2):
if where_dealiased[i0, i1, i2]:
data[ik, i0, i1, i2] = 0.
在这里,我需要为一维,二维和三维的情况下三种功能。是否有一个好的方法来编写一个可以完成所有(合理)维度的工作的函数?
PS:在这里,我试过使用记忆体,但我不确定这是正确的方法来做到这一点。令我感到惊讶的是,在cython -a
命令生成的带注释的html中,行if where_dealiased[i0]: data[ik, i0] = 0.
不是白色。有什么不对?