【发布时间】:2012-10-23 08:20:20
【问题描述】:
有使用 C here 创建自定义 numpy dtypes 的示例:
另外,seems to be possible 在 cython 中创建自定义 ufunc:
似乎也应该可以使用 cython 创建一个 dtype(然后为其创建自定义 ufunc)。可能吗?如果是这样,您可以发布一个示例吗?
用例:
我想做一些生存分析。基本数据元素是具有相关审查值的生存时间(浮点数)(如果关联时间表示故障时间,则为 False,如果它表示审查时间(即在观察期间没有发生故障),则为 True)。
显然,我可以只使用两个 numpy 数组来存储这些值:一个用于时间的浮点数组和一个用于检查值的布尔数组。但是,我想考虑一个事件多次发生的可能性(这是一个很好的模型,比如说,心脏病发作 - 你可以有不止一个)。在这种情况下,我需要一个我称之为MultiEvents 的对象数组。每个MultiEvent 包含一系列浮点数(未经审查的故障时间)和一个观察期(也是一个浮点数)。请注意,所有MultiEvents 的失败次数并不相同。
我需要能够对MultiEvents 的数组执行一些操作:
获取每个失败的次数
获取删失时间(即观察时间减去所有失效时间的总和)
-
根据其他参数数组(例如危险值数组)计算对数似然度。例如,单个
MultiEventM和恒定危险值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 来说太慢了。还要注意,我不能这样做 this,因为我的 MultiData 对象中的失败次数事先不知道。
【问题讨论】:
-
您问的原因是因为您发现编写 cython 比编写 C 更简单吗?我怀疑如果可能的话(我不知道),你最终会得到和 C 一样复杂和混乱的代码,所以可能没有任何好处。
-
@DaveP 有两个原因。一个是我发现用 cython 编写比 C 更简单。另一个是我想让这个过程更容易让 python 程序员重复新的 dtypes 和 ufuncs。我希望我可以包装大部分复杂性并使定义 dtypes 在 cython 中成为一件简单的事情。也就是说,cython 是我上周才了解到的。我一直在玩它,但目前我并不完全了解它的功能。
-
最好有一个用例,以便我们为您提供帮助
-
你考虑过使用pandas