NumPy .reshape方法处理向量化数据偶发报错原因咨询
异常原因
这个报错和numpy的reshape方法本身没关系,是三个问题叠在一起导致的:
- 你看到的
ValueError: Expected a 1D array, got an array with shape (100, 512)根本不是numpy抛出的,是pandas的列赋值校验抛出的。
老版本pandas有个固定逻辑:如果你给单个列传形状为(行数, 特征数)的二维数组,它会默认你要一次性赋值特征数个列,而不是在1个列里每行存一个向量。这时候你只写了一个列名vectorized_urls,匹配不到对应数量的列位置,就会抛这个“期望1D数组”的错误。 - 改成
.reshape(100,1,-1)不报错的原因很简单:这个操作把数组转成了形状为(100,1,512)的三维数组,pandas碰到维度高于2的数组,就不会触发多列赋值的检查逻辑,只会把第一维对应的每个子数组当成单个独立对象,直接存入这一列,自然不会报错。跑完这行代码之后,你的df里已经成功创建了vectorized_urls列。 - 改回
.reshape(100,-1)又能正常运行,本质是Jupyter Notebook的变量状态是跟着单元格执行顺序动态变化的,不是每次运行单元格都是全新的初始状态:
一是你之前已经通过三维reshape的代码建好了vectorized_urls列,给已存在的列赋值时,pandas不会走新建列的严格校验逻辑,哪怕传入二维数组也不会报错;二是你用的tfh向量化接口本身输出可能不稳定,受框架缓存、之前运行过的张量操作影响,有时候会直接返回展平的一维数组,这时候reshape本身就是正常的形状转换操作,也不会触发报错。
至于你说的问题概率触发,根本不是玄学:只要你重启内核从头按固定顺序跑单元格,这个报错会100%稳定复现。你觉得时好时坏,只是因为每次手动改代码跑单元格的时候,内存里的df、vectorized变量状态都不一样,有时候是新建列、有时候是覆盖已有旧列,有时候tfh返回的张量维度有差异,自然不会每次都触发报错。
正确修复方式
别用reshape(100,1,-1)绕问题,这种写法存到列里的是三维子数组,后续做KNN特征拼接、距离计算的时候还会碰到维度不匹配的问题。你要在单列存每行对应的512维向量,直接把二维数组转成列表再赋值即可,pandas会自动把列表里的每个元素识别为单行的值:
vectorized = tfh(df['url']) # 用len(df)取实际样本数,不要写死100,避免后续数据量变化触发reshape错误 url_vectors = np.array(vectorized).reshape(len(df), 512).tolist() df['vectorized_urls'] = url_vectors
内容的提问来源于stack exchange,提问作者user19397268
相关产品推荐
相关产品推荐

