You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:29:54