为何使用多层列表创建NumPy矩阵时结果包含list类型而非数组结构?
为什么NumPy矩阵里出现了list类型而非规整数组?
嘿,这个问题我之前排查过类似的情况,咱们来一步步理清原因和解决办法:
核心原因:子列表长度不一致
你看输出里的各个子元素:
- 第一个list是
[1.0, 2.0, 2.0, 3.0, 4.0](5个元素) - 第二个list是
[2.0, 23.0, 43.0, 21.0, 32.0, 423.0](6个元素)
NumPy创建二维数值矩阵的前提是所有子列表的长度必须完全相同,这样它才能推断出统一的维度。如果子列表长度参差不齐,NumPy无法生成规整的二维数组,就会把每个子list当作独立的对象存入矩阵,这就是你看到结果里充满list()的原因。
你的代码里的其他细节优化
除了输入数据的问题,代码里还有几个可以调整的地方:
- Python版本兼容问题:如果是Python 3,
map(float, ...)返回的是迭代器而非列表,直接append会导致resultlist里存的是迭代器对象,建议改成list(map(float, re.split(c,i)))来确保得到列表。 - 弃用的
np.matrix():现在NumPy官方更推荐使用np.array()来创建数组,np.matrix()已经逐渐被淘汰,功能上array更灵活通用。 - 偏置项插入错误:你代码里
np.insert(data,0,1,0)的axis=0是在顶部插入一行全1,如果你的需求是给每个样本(每一行)添加偏置项(即第一列全1),应该把axis参数改成1,也就是np.insert(data, 0, 1, axis=1)。
修复后的示例代码
import re import numpy as np def readData(fname, datatype): c = re.compile(r'\s+') with open(fname) as f: # 使用with语句自动关闭文件更安全 rowstringlist = f.readlines() resultlist = [] for i in rowstringlist: i = i.strip() if not i: # 跳过空行 continue # 确保转成列表,兼容Python2/3 nums = list(map(float, re.split(c, i))) resultlist.append(nums) # 先检查所有子列表长度是否一致 lengths = set(len(row) for row in resultlist) if len(lengths) > 1: raise ValueError(f"输入文件存在长度不一致的行:{lengths}") data = np.array(resultlist) if datatype == 'X': data = np.insert(data, 0, 1, axis=1) # 给每一行开头加1(偏置项) return data
内容的提问来源于stack exchange,提问作者Zhihao ZHAO
相关产品推荐
相关产品推荐

