jcr*_*udy 24 python numpy cython
有创建用C定制numpy的dtypes例子在这里:
另外,似乎可以在cython中创建自定义ufunc:
似乎也应该可以使用cython创建一个dtype(然后为它创建自定义ufunc).可能吗?如果是这样,你能发一个例子吗?
使用案例:
我想做一些生存分析.基本数据元素是具有相关审查值的生存时间(浮点数)(如果关联时间表示失败时间则为假,如果它代表审查时间则为True(即,在观察期间未发生故障)).
显然,我可以使用两个numpy数组来存储这些值:时间的float数组和censor值的bool数组.但是,我想说明事件发生多次的可能性(这是一个很好的模型,比如心脏病发作 - 你可以拥有多个).在这种情况下,我需要一个对象数组,我称之为MultiEvents.每个都MultiEvent包含一系列浮点数(未经审查的失败时间)和一个观察期(也是一个浮点数).请注意,所有MultiEvents 的故障数量并不相同.
我需要能够在一个MultiEvents 数组上执行一些操作:
获取每个故障的数量
获得删失时间(即观察时间减去所有失败时间的总和)
根据其他参数数组(例如危险值数组)计算对数似然.例如,单个MultiEvent M和持续危险值的对数似然h可能是这样的:
sum(log(h) + h*t for t in M.times) - h*(M.period - sum(M.times))
M.times失败时间的列表(数组,等等)在哪里,M.period是总观察期.我希望适用适当的numpy广播规则,以便我能做到:
log_lik = logp(M_vec,h_vec)
Run Code Online (Sandbox Code Playgroud)
只要尺寸M_vec和h_vec兼容性,它就能工作.
我当前的实现使用numpy.vectorize.这工作得很好1和2,但实在是太慢了3.另请注意,我不能做这个,因为失败的我多数据对象数量不提前知道.
我很抱歉没有直接回答这个问题,但我以前也遇到过类似的问题,如果我理解正确的话,你现在遇到的真正问题是你有可变长度的数据,这真的不是其中之一numpy 的优势,也是您遇到性能问题的原因。除非您事先知道多事件的最大条目数,否则您将会遇到问题,即使这样,您也会浪费大量内存/磁盘空间,这些空间填充了非多事件的事件。
您的数据点包含多个字段,其中一些与其他字段相关,还有一些需要分组标识。这强烈暗示,出于性能、内存、磁盘空间和健全性的原因,您应该考虑某种形式的数据库来存储这些信息。
对于刚接触代码的人来说,理解简单的数据库模式比理解复杂的、在 numpy 上进行修改的结构要容易得多,后者的速度慢得令人沮丧且臃肿。相比之下,SQL 查询编写起来既快速又容易。
根据我对您的解释的理解,我建议使用事件和多事件表,其中每个事件条目在相关的多事件表中都有一个外键。