NumPy创建含EntityProxy的结构化数组报UnicodeEncodeError
问题1解答:报错根因
报错和object字段本身无关,核心是两点原因:
- 输入格式不符合结构化数组要求:创建NumPy结构化数组时,单条记录的多个字段值必须用元组包裹。你直接传入扁平列表
['0000098765', company1],NumPy不会自动把两个元素按顺序映射到cid和company字段,而是会把列表里的每个元素当成一条独立的完整记录处理。你运行成功的test2输出已经能印证这个逻辑:结果出现了明显错位,b'0000012345'被存到cid字段时,对应company字段存的是字符串'0000012345';第二条记录的cid字段存了b'Letter A',company字段才是company2对象。 - 错位触发编码错误:因为NumPy把
company1对象当成了要写入第一个字段S10(定长ASCII字节串)的值,会先调用对象的字符串表示再编码为ASCII字节串,当字符串里出现ASCII范围外的Ł字符时,自然抛出UnicodeEncodeError。你之前把company字段改成U类型依然报错,也是因为错误发生在company1被尝试转换到cid字段的环节,和company字段的类型设置没有关系。
而创建普通object数组时,NumPy不需要做任何类型强制转换,直接存储原对象的引用即可,不会触发字符串编码流程,所以不会报错。
问题2解答:正确配置方式
分两步调整即可完全解决问题:
- 修正dtype配置:
cid字段不要用S类型(字节串),改用U类型(Unicode字符串)存储固定长度的企业ID,避免不必要的编码转换;company字段用O(object)类型存储实体对象即可,正确dtype定义如下:
company_dtype = [('cid', 'U10'), ('company', 'O')]
- 修正数组传入格式:每条记录用元组包裹,明确告知NumPy字段和值的对应关系,正确的创建代码如下:
# 单条记录格式:[(字段1值, 字段2值)] test1 = np.array([('0000098765', company1)], dtype=company_dtype)
调整后不会触发编码错误,访问test1[0]['company']可以直接拿到原始的EntityProxy对象,test1[0]['cid']可以拿到对应的企业ID字符串。
内容的提问来源于stack exchange,提问作者codkelden
相关产品推荐
相关产品推荐

