You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NumPy创建含EntityProxy的结构化数组报UnicodeEncodeError

问题1解答:报错根因

报错和object字段本身无关,核心是两点原因:

  1. 输入格式不符合结构化数组要求:创建NumPy结构化数组时,单条记录的多个字段值必须用元组包裹。你直接传入扁平列表['0000098765', company1],NumPy不会自动把两个元素按顺序映射到cid和company字段,而是会把列表里的每个元素当成一条独立的完整记录处理。你运行成功的test2输出已经能印证这个逻辑:结果出现了明显错位,b'0000012345'被存到cid字段时,对应company字段存的是字符串'0000012345';第二条记录的cid字段存了b'Letter A',company字段才是company2对象。
  2. 错位触发编码错误:因为NumPy把company1对象当成了要写入第一个字段S10(定长ASCII字节串)的值,会先调用对象的字符串表示再编码为ASCII字节串,当字符串里出现ASCII范围外的Ł字符时,自然抛出UnicodeEncodeError。你之前把company字段改成U类型依然报错,也是因为错误发生在company1被尝试转换到cid字段的环节,和company字段的类型设置没有关系。
    而创建普通object数组时,NumPy不需要做任何类型强制转换,直接存储原对象的引用即可,不会触发字符串编码流程,所以不会报错。

问题2解答:正确配置方式

分两步调整即可完全解决问题:

  1. 修正dtype配置:cid字段不要用S类型(字节串),改用U类型(Unicode字符串)存储固定长度的企业ID,避免不必要的编码转换;company字段用O(object)类型存储实体对象即可,正确dtype定义如下:
company_dtype = [('cid', 'U10'), ('company', 'O')]
  1. 修正数组传入格式:每条记录用元组包裹,明确告知NumPy字段和值的对应关系,正确的创建代码如下:
# 单条记录格式:[(字段1值, 字段2值)]
test1 = np.array([('0000098765', company1)], dtype=company_dtype)

调整后不会触发编码错误,访问test1[0]['company']可以直接拿到原始的EntityProxy对象,test1[0]['cid']可以拿到对应的企业ID字符串。

内容的提问来源于stack exchange,提问作者codkelden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:15:46