如何从DataFrame按每10行提取数据生成numpy数组及优化
我来帮你优化这段代码并实现第11行的处理逻辑~
一、优化原有连续10行截取逻辑
原代码的循环做了很多不必要的长度判断,其实我们可以直接锁定有效的起始索引范围——只有当i + 10 <= 总数据行数时,截取的片段才会是完整的10行。下面提供两种优化方案:
方案1:精简循环(易读性优先)
提前把DataFrame转成numpy数组(避免每次切片重复转换),然后直接遍历有效起始索引,省去无效的长度检查:
import numpy as np import pandas as pd # 提前将DataFrame转为numpy数组,一次转换更高效 df_np = df.to_numpy().astype(float) window_size = 10 total_rows = df_np.shape[0] # 有效的起始索引范围:从0到 total_rows - window_size(包含) valid_starts = range(total_rows - window_size + 1) # 生成最终的X数组 X = np.array([df_np[i:i+window_size] for i in valid_starts])
方案2:numpy滑动窗口(性能优先,适合大数据量)
如果你的数据量很大(比如几万行以上),可以用numpy的stride_tricks.as_strided创建内存视图,不需要复制数据,性能会大幅提升:
df_np = df.to_numpy().astype(float) window_size = 10 total_rows, n_features = df_np.shape n_windows = total_rows - window_size + 1 # 创建滑动窗口视图,无数据复制 X = np.lib.stride_tricks.as_strided( df_np, shape=(n_windows, window_size, n_features), # 输出形状:(窗口数, 窗口行数, 特征数) strides=(df_np.strides[0], df_np.strides[0], df_np.strides[1]) # 步长设置 ) # 如果需要修改X的内容(避免影响原数组),可以添加.copy() # X = X.copy()
注意:这种方式生成的是原数组的视图,修改X会同步修改原
df_np,若需要独立数组则加上.copy()。
二、实现第11行的处理逻辑
假设你的需求是每个10行片段对应它后面的第11行(比如第0-9行对应第10行,第1-10行对应第11行),我们可以直接截取原数组中从第10行开始的所有行,刚好和X的窗口数量一一对应:
# 接上面的代码,生成对应的第11行数组y y = df_np[window_size:]
比如你有974行数据,n_windows = 974 -10 +1 = 965,y的长度为974 -10 = 965,每个X[i]刚好对应y[i],完美匹配。
内容的提问来源于stack exchange,提问作者Khun
相关产品推荐
相关产品推荐

