如何合并两种dtype的NumPy数组?解决类型转换报错
解决NumPy不同结构化数组合并问题
你遇到的问题核心是两个数组的dtype完全不兼容,直接用np.array、stack这类方法会触发强制类型转换,导致报错。正确的做法是创建一个复合结构化数组,把两个原数组作为独立字段填充进去,具体步骤如下:
问题原因
np.array([table1, table2])会尝试将两个数组的元素按位置拼接,但table1是字符串类型,table2是嵌套的结构化数组,NumPy无法自动完成这种类型转换,所以抛出invalid literal for int() with base 10错误。stack、concatenate则要求输入数组的维度和dtype一致,自然也无法执行。
解决方案
直接构建复合结构化数组,通过字段赋值完成合并:
import numpy as np # 模拟输入字典(请替换为你的实际数据) pointerTable = { b'key1': ((1, b'table1'), (2, b'table2')), b'key2': ((3, b'table3'), (4, b'table4')) } dtTable1 = np.dtype("<S22") table1 = np.fromiter(pointerTable.keys(), dtTable1) dt = np.dtype([('pointer', np.int16), ('table', "<S22")]) dtTable2 = np.dtype([('table_pointer', dt, (2,))]) # 用(2,)明确子数组形状为2的一维结构 table2 = np.fromiter(pointerTable.values(), dtype=dtTable2) # 1. 定义包含两个字段的复合dtype new_dtype = np.dtype([ ('keys', dtTable1), ('vals', dtTable2) ]) # 2. 初始化空数组,长度与原数组一致 pTable = np.empty(len(table1), dtype=new_dtype) # 3. 分别给两个字段赋值 pTable['keys'] = table1 pTable['vals'] = table2 # 验证结果 print(pTable) print("\n数组dtype:", pTable.dtype)
说明
- 这种方法不需要类型转换,直接将原数组的数据映射到新数组的对应字段,完全保留原数据的dtype和结构
- 必须保证
table1和table2的长度相同,否则无法完成字段赋值 dtTable2定义时用(2,)而非(2),明确表示这是一个形状为2的一维子数组,避免潜在的dtype解析歧义
内容的提问来源于stack exchange,提问作者Nixcc
相关产品推荐
相关产品推荐

