使用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.
不是白色。有什麼不對?