如何修改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
相关产品推荐
相关产品推荐

