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

如何修改modified_transform_to_array函数以返回指定4D数组形状

解决方法

要让modified_transform_to_array()返回预期的(n_samples, 1, chunk_size, 4)形状,同时保留高效性,有两种简洁的修改方式,核心都是给数组补充缺失维度,且不会影响执行速度:

方法一:最后统一扩展维度(推荐)

在将列表转为numpy数组后,使用np.expand_dims()在第1个轴(索引为1)插入新维度。这个操作是numpy的视图操作,不会复制数据,几乎不消耗额外时间。

修改后的完整函数:

def modified_transform_to_array(dataframe, chunk_size=100):
    grouped = dataframe.groupby('id')
    X, y = [], []

    for _, group in grouped:
        inputs = group.loc[:, 'A':'D'].values 
        label = group.loc[:, 'label'].values[0]

        N = (len(inputs)-1) // chunk_size

        if N > 0:
            inputs = np.array_split(
             inputs, [chunk_size + (chunk_size*i) for i in range(N)])
        else:
            inputs = [inputs]

        for inpt in inputs:
            inpt = np.pad(
            inpt, [(0, chunk_size-len(inpt)),(0, 0)], 
                mode='constant')
            X.append(inpt)
            y.append(label)

    # 转为数组后扩展维度
    X = np.array(X)
    X = np.expand_dims(X, axis=1)  # 新增这一行
    y = np.array(y)

    return X, y

测试验证:

X2, y2 = modified_transform_to_array(df)
print(X2.shape)  # 输出 (20000, 1, 100, 4)
print(y2.shape)  # 输出 (20000,)

# 时间测试
start_time = time.time()
X2, y2 = modified_transform_to_array(df)
end_time = time.time()
print(f'Time taken: {end_time - start_time} seconds.')
# 耗时仍保持在~5秒左右,和原改进函数几乎一致

方法二:循环中提前添加维度

在append的时候,给每个inpt提前增加一个维度,这样列表转数组后直接就是目标形状:

修改循环内的append行:

# 替换原来的X.append(inpt)
X.append(np.expand_dims(inpt, axis=0))  # 等价于 X.append(inpt[np.newaxis, :, :])

这种方式也能达到效果,但相比方法一,循环中每次都要处理维度,虽然性能差异极小,但方法一更简洁高效。

原理说明

原改进函数中,每个inpt的形状是(100,4),append到列表后转成数组是(n_samples,100,4)。而原函数通过inpt[np.newaxis, np.newaxis]将单个inpt转为(1,1,100,4),再通过concatenate得到(n_samples,1,100,4)。我们的修改本质是补全这个缺失的维度,且用更高效的方式实现。

内容的提问来源于stack exchange,提问作者arilwan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:05:22