Python版cmprsk包示例Notebook运行报错求助
解决Python调用cmprsk包时的数组形状不匹配报错
这个ValueError是因为rpy2在把R返回的对象转成Python数组时,遇到了长度不一致的子元素,没法生成均匀形状的numpy数组。试试下面几个方案:
先检查R返回结果的结构
调用cmprsk函数后,用rpy2打印R对象的结构,看看是不是有长度不一致的元素:from rpy2.robjects import r # 假设你的模型结果存在res变量里 print(r.str(res))如果发现子元素长度不一样,说明R返回的是异质结构,不能直接转成numpy数组。
手动提取单个字段而非整体转换
针对cmprsk的输出(比如crr模型结果),逐个提取需要的字段,比如系数、p值:import numpy as np from rpy2.robjects import pandas2ri pandas2ri.activate() # 提取系数 coefs = res.rx2('coef') coef_array = np.array(coefs) # 提取p值 p_values = res.rx2('pvalues') p_array = np.array(p_values)别直接把整个R结果对象转成numpy数组,部分子元素本来长度就不一样。
核对版本兼容性
Python 3.11.1和rpy2 3.4.5可能存在兼容问题——rpy2 3.4.5是2021年的版本,对Python 3.11的支持可能不全。可以试试降级Python到3.10.x,或者升级rpy2到支持Python 3.11和R 4.2.2的最新版本(比如3.5.x及以上)。先验证R环境是否正常
打开R终端,运行和Python里一样的cmprsk代码,确认R本身能正常输出结果,排除R包安装或数据的问题:library(cmprsk) # 运行GitHub示例里的代码,比如: data(pbc) pbc$status[pbc$status>=1] <- pbc$status[pbc$status>=1]-1 crr.fit <- crr(ftime=pbc$time, fstatus=pbc$status, cov1=pbc[,c('age','sex',' bili','edema')]) summary(crr.fit)如果R里没问题,再回到Python里排查转换环节的问题。
修改示例代码的转换逻辑
GitHub的示例可能默认rpy2能无缝转换所有R对象,但你的版本组合下失效了。可以显式处理每个返回字段:import numpy as np from rpy2.robjects import vectors coef_vector = vectors.FloatVector(res.rx2('coef')) coef_array = np.array(coef_vector)
内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows
相关产品推荐
相关产品推荐

