NumPy StringDType 用 heapsort 排序,进程直接段错误退出
特定重复四位字符串在 NumPy 2.5.4 的 quicksort、heapsort 路径中崩溃。可控 argsort 局部选 stable,不把它当成 unique 内部排序开关。
对 StringDType 字符串数组调用 argsort(kind="heapsort"),Python 直接段错误退出;换成稳定排序又能返回。若使用 NumPy 2.5.4,要保留 dtype、字符串长度、重复值和排序算法,不能只把它归为内存不足。
明确的触发输入是两份拼接的、补足四位的数字 ID 字符串,Linux、Python 3.14.8 与 NumPy 2.5.4 的组合中,quicksort 和 heapsort 会崩溃,stable 与 mergesort 没有触发同样故障。这个输入边界不能扩大成“所有重复字符串都会崩溃”,也不能据此改掉 ID 的前导零。
自己控制的排序调用可明确选择 stable
需要得到排序索引时,可以局部选择稳定排序:
import numpy as np
ids = np.array([f"{i:04d}" for i in range(128)] * 2,
dtype=np.dtypes.StringDType())
order = ids.argsort(kind="stable")
sorted_ids = ids[order]
这是相关输入下已知可用的排序路径,不是对整个 StringDType 实现的修复证明。若同时排列其他列,必须使用同一个 order,不能只排序 ID 后留下错位的业务数据。
稳定排序会保留相等元素的原相对次序。业务此前没有约定平局顺序时,也应确认下游没有无意依赖旧的不稳定顺序,尤其在按排序结果选择第一条记录的流程中。
unique 的内部排序不能靠这行全局改变
同类崩溃也曾从 np.unique(..., return_inverse=True) 的调用中出现,但在别处增加一次 argsort(kind="stable"),不会为 unique 的内部排序设置全局算法。若真实栈来自 unique,先保留返回逆映射的需求和对应关系,再评估包含修复的正式依赖或独立的数据处理方案,不能只把去重前的数组排好就假定问题消失。
段错误通常不会成为可用 try/except 捕获的普通异常,不应在正式任务中反复提交相同崩溃输入。先保留故障栈和环境,再在隔离任务核对稳定排序、原数据与随行字段的配对、重复项次序和缺失值规则。
NumPy 2.5.4 中,仍应对这类输入明确选择可用的排序路径。后续升级先用原数据检查,再决定是否恢复默认算法。StringDType 配置了缺失哨兵时,还需按那个 dtype 的排序约定验收,不能直接套用本例全是普通字符串的前提。


