NumPy strip 换个字符顺序,StringDType 清洗结果就变了
删除字符集包含多字节字符时,StringDType 的 strip 可能漏掉后面的 ASCII 字符。按已确认输入局部使用 Python 字符串方法,并保留缺失语义。
np.strings.strip() 没有报错,却留下本应删除的 a;把删除字符集从 "éa" 改成 "aé",结果又正确。若数组采用 dtype="T",应检查 StringDType 的 UTF-8 字符查找,而不是依赖字符集排序来清洗数据。
chars 表示一组字符,不是必须整体匹配的前后缀。对于 "a",这两种顺序都应该得到空字符串。这种现象在 NumPy 2.3.5 的运行环境中出现;2.5.4 仍保留下面这段字符数与字节数混用的查找逻辑,使用该版也应检查自己的字符集与输出。
多字节字符让后面的 ASCII 字符漏出查找范围
相关实现先计算 chars 的 Unicode 码点数,再在 UTF-8 的单字节查找分支中把这个数当作字节长度。é 占两个 UTF-8 字节,后面的 a 便可能不在实际搜索范围内。lstrip 和 rstrip 也经过这条公共处理路径。
字符排序影响输出,正是值得保留的对照条件;不要把调整字符顺序当成修复。换一组中文或其他多字节字符后,同样的规避未必成立。
已确认全是普通字符串时,局部采用 Python 的 strip
对于没有缺失值哨兵的普通 StringDType 数组,可以在这一步显式调用标准字符串方法,再恢复原形状:
import numpy as np
values = np.array([["a", "éapplea"]], dtype="T")
chars = "éa"
cleaned = np.array(
[value.strip(chars) for value in values.flat],
dtype=np.dtypes.StringDType(),
).reshape(values.shape)
Python str.strip(chars) 仍按字符集合处理,不会只删除整个前缀。示例中的 éapplea 会从两端连续删除集合内字符,直到遇到其他字符;需要去掉精确前缀时,应另外使用相应的前缀规则,不能混用。结果保存在独立数组中,原始 values 保留,清洗规则有误时可从原数据重新生成,不从已经删过字符的文本反推。
这段转换只适用于已确认元素都是字符串的输入。如果原 dtype 配置了 na_object,先保留并明确处理缺失掩码,再对有效字符串执行操作。不能把 None、NaN 或 pd.NA 直接 str() 化,那会把缺失变成普通文本;重建时也不能无意丢掉原来的缺失语义。
固定宽度 Unicode 数组走另一条字符表示,但转成随手指定的 U1、U10 可能截断实际内容。它与xarray 写出 StringDType 坐标的文件类型兼容问题不同,不应直接套用写文件时的 dtype 转换。
复查要比较字符集的不同排列、左右两端、空串以及实际多语言内容,并检查数组形状与缺失位置。后续升级也应使用同组字符集检查清洗结果,确认两种排列得到相同输出后,再决定是否撤去局部处理。


