Cython을 사용하면 다른 차원의 배열에서도 사용할 수있는 빠른 일반 함수를 작성할 수 있습니까? dealiasing 기능이 간단한 경우에 대한 예를 들어 : 여기서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.
, I는 일차원 2 차원 및 3 차원의 경우 세 가지 기능을 필요로한다. 모든 (합리적인) 차원에서 작업을 수행하는 함수를 작성하는 좋은 방법이 있습니까?
추신 : 여기, 나는 memoryviews를 사용하려고 시도했지만, 이것이 올바른 방법이라고 확신하지 못합니다. 나는 if where_dealiased[i0]: data[ik, i0] = 0.
이라는 줄이 cython -a
명령에 의해 작성된 주석이 달린 HTML에서 흰색이 아니라는 사실에 놀랐다. 뭔가 잘못 됐니?