0

我正在尝试产生时间序列噪声。我的噪声数组大小约为 350,000,因此它们必须是堆分配的。如何在调用函数时将我的堆分配数组返回给调用该函数的 python 代码?我尝试将其转换为 nd.array 但 python 在编译过程中抱怨。

我是 cython 的新手,希望能对它的工作原理进行真正的解释。我在网上找到的所有东西都非常复杂,对初学者不友好。

另外,如果有人知道如何将 np.random.normal 调用替换为 cython 版本,那就太好了。对于简单的高斯随机数生成器,我在互联网上找不到任何不是超级复杂的东西。

这是我的 pyx 文件:

import numpy as np
cimport numpy as np

from libc.stdlib cimport malloc, free



# TODO turn this into a cython script. Generate function is slow for 350,000 samples
cdef class NoiseGenerator():

    cdef double mean, std, tau, start_value, previous_value
    cdef double* noise


    def __cinit__(self, double mean=0.0, double std=1.0, float tau=0.2, float start_y=0):
        self.mean = mean
        self.std = std
        self.tau = tau
        self.start_value = start_y


    cdef double sample_next(NoiseGenerator self, double dx):

        cdef double red_noise, wnoise 

        if self.previous_value is None:
            red_noise = self.start_value

        else:
            wnoise = np.random.normal(loc=self.mean, scale=self.std, size=1)
            red_noise = ((self.tau/(self.tau + dx)) * (dx*wnoise + self.previous_value))

        self.previous_value = red_noise
        return red_noise


    cdef np.array generate(NoiseGenerator self, double dx, int samples):

        self.noise = <double *>malloc(samples * sizeof(double))

        for idx in range(samples):

            noise[idx] = self.sample_next(dx)

        return nd.array(self.noise)


    def __dealloc__(NoiseGenerator self):

        free(self.noise)

从python脚本这就是我想使用它的方式:

import numpy as np
import pyximport; pyximport.install(setup_args={'include_dirs': np.get_include()})
from CNoiseGenerator import NoiseGenerator


mean = -2.5914938426209425e-06
std=0.00024610271604726564
dx=0.0018104225094430712
samples=352036

noise = NoiseGenerator(mean, std).generate(dx, samples)

任何关于如何重构我的课程的建议将不胜感激。再次在这里学习!

4

0 回答 0