Cython を使用して、異なる次元の配列に対して機能する高速な一般関数を作成する方法はありますか? たとえば、関数のエイリアスを解除するこの単純なケースの場合:
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.
ここでは、1 次元、2 次元、3 次元の場合に 3 つの関数が必要です。すべての (妥当な) ディメンションに対して機能する関数を作成する良い方法はありますか?
PS:ここでは、メモリビューを使用しようとしましたが、これが正しい方法かどうかはわかりません。if where_dealiased[i0]: data[ik, i0] = 0.
コマンドによって生成された注釈付きのhtmlで線が白くないことに驚いていcython -a
ます。何か問題がありますか?