使用genfromtxt导入CSV后格式异常,如何转为标准Numpy数组?
解决Numpy结构化数组转普通二维数组的问题
嘿,我懂你的困扰——用genfromtxt加names=True导入CSV后,得到的是一堆带括号的元组样式,这其实是Numpy的结构化数组,不是咱们常用的普通二维数值数组。这是因为names=True会让Numpy把每一行解析成带列名字段的结构化元素,而不是直接的数值矩阵。下面给你几个解决办法:
方法1:把已读入的结构化数组转成普通数组
如果你已经用现有代码读入了数据,直接用下面的代码转换就行:
import numpy as np # 假设train_data是你已读入的结构化数组 # 方式一:通过view和reshape高效转换(适合所有字段都是同类型数值的情况) normal_array = train_data.view(np.float64).reshape(train_data.shape[0], -1) # 方式二:转成列表再转数组(更稳妥,兼容混合数值类型) normal_array = np.array(train_data.tolist())
转换后你得到的就是标准的二维Numpy数组,格式会是[[0., 25.20824887, -16.745...], [1., -86.93144987, 0.42822719...], ...]这样的。
方法2:导入时直接得到普通数组
如果不想先得到结构化数组,你可以跳过names=True,手动处理列名:
from numpy import genfromtxt # 先读取第一行获取列名 with open("file.csv", 'r') as f: col_names = f.readline().strip().split(',') # 读取数据时跳过表头,直接得到普通二维数组 train_data = genfromtxt("file.csv", delimiter=',', skip_header=1, dtype=float) # 要是需要单独提取label列,用列名找索引就行 label_index = col_names.index('label') labels = train_data[:, label_index] # 特征数据就是去掉最后一列(或者用label_index切片) features = train_data[:, :-1]
这种方式一开始就拿到了普通数组,后续处理更符合常规的数值数组操作习惯。
方法3:借助Pandas快速转换(可选)
如果你不排斥用Pandas的话,这会是最省心的方式:
import pandas as pd import numpy as np # 用Pandas读取CSV df = pd.read_csv("file.csv") # 直接转成Numpy数组 train_data = df.to_numpy()
Pandas会自动处理列名和数据类型,转成的数组就是标准的二维格式,同时你还能保留DataFrame来方便地按列名操作数据。
内容的提问来源于stack exchange,提问作者DreamerP
相关产品推荐
相关产品推荐

