使用np.array()批量生成数组异常求助(Python3.6)
解决读取多Excel文件生成多维数组异常的问题
我之前也碰到过类似的坑,咱们来一步步捋清楚问题根源和解决办法:
问题根源分析
你说读取少量文件时能生成正常的二维数值数组,但读全量文件就变成了嵌套列表的object类型数组,核心原因大概率是:
- 虽然你认为所有Excel的行列数一致,但实际有某个文件的
price列长度和其他文件不一样(比如存在隐藏行、空行,或是读取时表头识别错误导致行数偏差); - 当
numpy发现传入的列表中子列表长度不一致时,会自动把数组的 dtype 设为object,每个元素存一个列表,就出现了你看到的array([list([0.0, 0.0,...])...])这种情况。
两种可靠的解决办法
方法1:用Pandas合并后转数组(推荐)
这种方法能自动处理数据对齐,还方便排查长度异常的文件:
import numpy as np import pandas as pd import os # 把路径定义成变量,避免重复写长路径 dir_path = r'C:\Users\Administrator\Desktop\New folder\SecData\renzaorou\sec20190527' file_list = os.listdir(dir_path) price_series_list = [] for filename in file_list: print(f"正在读取文件:{filename}") file_full_path = os.path.join(dir_path, filename) df = pd.read_excel(file_full_path) # 可选:打印每个文件price列的长度,方便排查异常 print(f"{filename}的price列行数:{len(df['price'])}") # 把price列作为Series存入列表 price_series_list.append(df['price']) # 按列合并所有Series后转置(让每个文件对应一行),再转成numpy数组 np_price = pd.concat(price_series_list, axis=1).T.values
方法2:用Numpy的vstack拼接数组
直接存储每个文件的price列numpy数组,再垂直拼接,确保生成标准二维数组:
import numpy as np import pandas as pd import os dir_path = r'C:\Users\Administrator\Desktop\New folder\SecData\renzaorou\sec20190527' file_list = os.listdir(dir_path) price_array_list = [] for filename in file_list: print(f"正在读取文件:{filename}") file_full_path = os.path.join(dir_path, filename) df = pd.read_excel(file_full_path) # 直接将price列转成numpy数组存入 price_array = df['price'].to_numpy() price_array_list.append(price_array) # 垂直拼接所有一维数组,生成二维数组 np_price = np.vstack(price_array_list)
额外排查建议
如果运行时发现某个文件的price列长度和其他不一样,建议打开该文件检查:
- 是否存在隐藏行、空行?
- 表头是否被正确识别?有没有出现表头被当成数据行的情况?
price列是否存在全空的异常情况?
内容的提问来源于stack exchange,提问作者Li May
相关产品推荐
相关产品推荐

