这里有使用 C 创建自定义 numpy dtypes 的示例:
此外,似乎可以在 cython 中创建自定义 ufunc:
似乎也应该可以使用 cython 创建一个 dtype(然后为其创建自定义 ufunc)。可能吗?如果是这样,你可以发布一个例子吗?
用例:
我想做一些生存分析。基本数据元素是具有相关审查值的生存时间(浮点数)(如果关联时间表示故障时间,则为假,如果它表示审查时间(即在观察期间没有发生故障),则为真)。
显然,我可以只使用两个 numpy 数组来存储这些值:一个用于时间的浮点数组和一个用于审查值的布尔数组。但是,我想考虑一个事件多次发生的可能性(这是一个很好的模型,比如说,心脏病发作 - 你可以有不止一个)。在这种情况下,我需要一个我称之为MultiEvent
s 的对象数组。每个都MultiEvent
包含一系列浮点数(未经审查的故障时间)和一个观察期(也是一个浮点数)。请注意,所有MultiEvent
s 的失败次数并不相同。
我需要能够对MultiEvent
s 数组执行一些操作:
获取每个失败的次数
获取删失时间(即观察时间减去所有失效时间的总和)
根据其他参数数组(例如危险值数组)计算对数似然。例如,单个
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)
只要 和 的尺寸兼容,它就可以M_vec
工作h_vec
。
我当前的实现使用numpy.vectorize
. 这对于 1 和 2 来说效果很好,但对于 3 来说太慢了。还要注意,我不能这样做,因为我的 MultiData 对象中的失败次数事先不知道。