为NumPy数组各列指定dtype时遇问题,请求技术帮助
NumPy数组按列指定数据类型的解决方案
核心问题分析
你遇到的类型转换错误,本质是结构化dtype的数组要求输入元组序列,而你传入的是列表的列表,导致NumPy对数据结构解析出错,把本该在最后一列的字符串分到了前面的数值列,触发类型转换失败。
方法一:用np.genfromtxt直接读取(最省心)
这是处理这类带混合类型文本文件的最优方案,无需手动遍历每行,直接指定数据类型即可:
import numpy as np # 定义各列的数据类型 dt = [('A', 'int'), ('B', 'float'), ('C', 'float'), ('D', 'float'), ('E', '<U32')] # skip_header=1 跳过第一行表头(和你原代码里的next(f)作用一致) array = np.genfromtxt('posizioni_mm.txt', dtype=dt, skip_header=1)
方法二:修改你原有的代码
只需要把每行split后的列表转成元组,就能让NumPy正确识别结构化数据:
import numpy as np with open('posizioni_mm.txt') as f: next(f) # 跳过表头行 dt = [('A', 'int'), ('B', 'float'), ('C', 'float'), ('D', 'float'), ('E', '<U32')] # 关键:把每行的split结果从列表转成元组 array = np.array([tuple(line.split()) for line in f], dtype=dt)
关于空结构化数组的创建
你之前用np.zeros(np.shape(array), dtype=dt)得到错误结构的数组,是因为原数组(未指定dtype时)是二维数组(n行5列),而结构化数组的形状应该是一维(n个元素,每个元素是含5个字段的元组)。正确创建空数组的方式:
# 假设原未指定dtype的数组为array_original array2 = np.empty(array_original.shape[0], dtype=dt) # 逐个字段赋值 array2['A'] = array_original[:, 0].astype(int) array2['B'] = array_original[:, 1].astype(float) array2['C'] = array_original[:, 2].astype(float) array2['D'] = array_original[:, 3].astype(float) array2['E'] = array_original[:, 4]
内容的提问来源于stack exchange,提问作者caesar753
相关产品推荐
相关产品推荐

