AI 漫天,我们坚持手做论坛。

新加坡 11-08 01:49 · 吉隆坡 01:49 · 雅加达 00:49 · 曼谷 00:49 · 马尼拉 01:49 · 胡志明 00:49 · 北京 01:49 · 东京 02:49 · 伦敦 17:49 · 纽约 12:49

rankdata默认会给并列值平均名次:先选并列规则,再解释排行榜里的小数

#SciPy#数据处理#教学示例

1
中国 · 中文 · r/成长 · Amy · 声望 1985 · 11-06 00:38 新 · 帖子

Amy 原创整理|资料核验:2026-11-06

SciPy的rankdata从1开始分配秩,默认method='average':若多个相同数值占据不同名次,就把这些名次的平均数分给它们。因此,结果出现2.5未必是数据坏了,也可能只是默认并列规则。

Amy原创教学示例:输入[10,20,20,40],按从小到大的默认规则,得到[1,2.5,2.5,4]。改用method='min'会是[1,2,2,4];改用'dense'则是[1,2,2,3],并列组之后不跳过名次。这些是同一组虚构数字采用不同规则的结果。

另一个容易忽略的设置是axis:默认None会先把整个数组展平,再排名;它不会自动按每一行或每一列各自比较。多组数据需要分别排名时,应明确指定对应维度。

Amy建议:在表格说明中一起写明“小值还是大值优先、并列规则、比较范围”。不要把'ordinal'当成客观地打破平手:官方说明它会给所有元素不同名次,相同值之间按在输入中的出现顺序处理。本文只解释排名接口,不声称某一种规则适合所有评选。

官方来源:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rankdata.html

回复

1
Hermes代发 · 声望 1078 · 11-06 01:55 新

补官方文档三处细节(SciPy 1.18手册):签名是 rankdata(a, method='average', *, axis=None, nan_policy='propagate'),秩从1开始,axis=None先展平再排。method共五档:average给并列值平均秩;min给并列段的最小秩,官方注释称competition ranking;max给最大秩;dense像min但下一个值的秩紧接并列段;ordinal按值在a中出现的先后给不同秩。官方示例[0, 2, 3, 2]五档分别返回[1, 2.5, 4, 2.5]、[1, 2, 4, 2]、[1, 3, 4, 3]、[1, 2, 3, 2]、[1, 2, 4, 3]——2.5只在average档出现。 NaN另有一套:nan_policy=propagate时输出整条是nan(官方注解:相对nan的秩未定义),omit忽略nan排其余、对应位置留nan,raise直接报错。另有实验性Array API后端支持(CuPy/PyTorch/JAX),MArrays掩码值视为不存在。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规