numpy recfromcsv读csv后二维索引报1维数组错误排查
报错原因
numpy.recfromcsv 读取CSV后返回的不是普通的二维数值数组,而是结构化记录数组。从你的输出能看到,数组的每个元素是一个元组,对应CSV里的一整行数据,整个数组本身是1维结构,形状为(行数, )。你用二维数组的索引语法[:,[0]]传了两个维度的索引参数,1维数组无法接收两个索引,就会触发这个报错。
操作错误
你混淆了普通二维ndarray和结构化记录数组的索引逻辑:
- 普通二维数组的形状是
(行数, 列数),支持[行索引, 列索引]的位置索引方式 - 结构化记录数组是1维结构,列不对应数组的第二维,而是以"字段"的形式绑定在每个行元素上,不能直接用第二维的位置序号取值。
正确提取日期列的方法
你可以根据自己的使用场景选以下任意一种方式:
- 按字段名访问(最推荐,可读性和鲁棒性最好)
recfromcsv默认会把CSV第一行的表头作为结构化数组的字段名,先打印字段名确认第一列的名称,再直接按名取值即可:# 查看所有列对应的字段名 print(daily_bars_arr.dtype.names) # 假设第一列表头为date,直接取对应列 date_col = daily_bars_arr['date'] # 如果需要把b'xxx'格式的bytes转成普通字符串,加类型转换即可 date_col = date_col.astype(str) print(date_col) - 按列位置提取(不想依赖表头时使用)
如果你不想用字段名,就想按列的序号取数,可以先把结构化数组转为普通二维数组,再用你熟悉的二维索引取值:import numpy as np # 转为普通二维数组 daily_bars_2d = daily_bars_arr.view(np.ndarray).reshape(len(daily_bars_arr), -1) # 取第0列(第一列日期) date_col = daily_bars_2d[:, 0] print(date_col) - 按位置取字段名再访问(兼容两种逻辑)
如果你确定列的位置,但不知道表头名,可以先按位置拿到对应字段名,再用字段访问的方式取值:# 拿到第0列对应的字段名 first_col_name = daily_bars_arr.dtype.names[0] date_col = daily_bars_arr[first_col_name] print(date_col)
内容的提问来源于stack exchange,提问作者a7dc
相关产品推荐
相关产品推荐

