如何解决Cython:将cython函数的double *堆数组作为一维np.ndarray返回到python
我正在尝试产生时间序列噪声。我的噪声数组的大小约为350,000,因此必须对其进行堆分配。调用函数时,如何将堆分配的数组返回给调用该函数的python代码?我曾尝试将其转换为nd.array,但python在编译过程中会抱怨。
我是cython的新手,很想对它的工作原理进行真正的解释。我在网上找到的所有内容都令人费解,而且对初学者不友好。
此外,如果有人知道如何替换cython版本的np.random.normal调用,那就更好了。对于简单的高斯随机数生成器,我在互联网上找不到任何不那么复杂的东西。
这是我的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)
任何有关如何重构班级的建议将不胜感激。再次在这里学习!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。