从numpy.object解码非ASCII字符时遇UnicodeEncodeError问题求助
解决numpy.object类型转字符串时的非ASCII字符编码错误
问题代码与报错
执行以下代码处理中文等非ASCII字符时:
import numpy as np sentence = ['世界'] a = np.array(sentence, dtype=object).reshape(-1) b = [sentence for sentence in np.char.decode(a.astype(np.bytes_), 'UTF-8')]
触发报错:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
原因分析
a.astype(np.bytes_)在将object类型的字符串转换为bytes时,默认使用ASCII编码,而中文等非ASCII字符超出ASCII编码范围,因此抛出编码错误。
解决方案
方案一:直接提取原字符串(最简方法)
object类型的numpy数组本身存储的就是原生Python字符串,无需额外编码解码,直接转列表即可:
import numpy as np sentence = ['世界'] a = np.array(sentence, dtype=object).reshape(-1) b = list(a) # 结果为['世界']
方案二:显式编码后再解码(适合必须转bytes的场景)
如果业务逻辑要求必须经过bytes转换,需先显式用UTF-8编码字符串,再转numpy的bytes数组,最后解码:
import numpy as np sentence = ['世界'] a = np.array(sentence, dtype=object).reshape(-1) # 先将每个字符串编码为UTF-8 bytes,再构建numpy数组 bytes_array = np.array([s.encode('UTF-8') for s in a], dtype=np.bytes_) # 解码回字符串并转列表 b = np.char.decode(bytes_array, 'UTF-8').tolist()
内容的提问来源于stack exchange,提问作者flexwang
相关产品推荐
相关产品推荐

