Python中scipy.stats的somersd函数触发TypeError问题排查
解决Somers' D计算时的TypeError问题
问题场景
现有一个名为crosstab的pandas DataFrame交叉表,数据如下:
| 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 100 | 80 | 100 | 4 | 500 |
| 50 | 3 | 2 | 0 | 38 |
| 40 | 0 | 4 | 0 | 40 |
| 2000 | 100 | 100 | 4 | 400 |
执行以下代码计算Somers' D时触发TypeError:
from scipy.stats import somersd somersd(crosstab)
错误信息如下:
TypeError: Invalid call to pythranized function _concordant_pairs(int64[:, :] (with unsupported column-major layout))' Candidates are: - _concordant_pairs(int[:,:]) - _concordant_pairs(float[:,:])
问题根源
scipy.stats.somersd依赖的底层函数_concordant_pairs仅支持**行优先(C-order)的数组,而pandas DataFrame默认采用列优先(Fortran-order/column-major)**的数组存储格式,两者格式不匹配导致报错。
解决办法
将DataFrame转换为行优先的numpy数组后再传入somersd即可,提供两种实现方式:
方式一:用np.ascontiguousarray转换
import numpy as np from scipy.stats import somersd # 转换为行优先格式的数组 crosstab_arr = np.ascontiguousarray(crosstab.values) # 计算Somers' D somers_result = somersd(crosstab_arr) print(somers_result)
方式二:用to_numpy()指定行优先
from scipy.stats import somersd # 直接生成行优先数组 crosstab_arr = crosstab.to_numpy(order='C') # 计算Somers' D somers_result = somersd(crosstab_arr) print(somers_result)
内容的提问来源于stack exchange,提问作者dika
相关产品推荐
相关产品推荐

