如何将object类型的嵌套numpy数组转换为目标三维数值数组
问题解决方法
问题核心原因
你得到object类型数组是因为调用np.asarray()时,输入列表里的子数组形状不统一,numpy无法将其合并为高维数值数组,只能退而求其次生成存储数组对象的数组。
对应到你给出的函数,问题出在循环范围设置错误:你用for i in range(n_records)遍历,当i的取值过大时,X[i : i + stepsBack]和X[i + stepsBack : i + stepsBack + stepsForward]的切片长度会小于你设定的stepsBack、stepsForward,导致所有切片形状不一致。同时原函数中xtest的切片范围逻辑错误,和xtrain存在重复。
解决方法
方法1:从根源修改生成函数,直接输出目标结构
调整循环的取值范围,保证所有切片的长度固定,同时修正测试集切片逻辑:
def walk_forward_train(X, stepsBack, stepsForward, trainTestSplit): n_records = len(X) X = X[:] # 修正循环范围,保证所有切片长度符合要求 max_i = n_records - stepsBack - stepsForward + 1 split = int(max_i * trainTestSplit) x = [] y = [] for i in range(max_i): x.append(X[i : i + stepsBack]) y.append(X[i + stepsBack : i + stepsBack + stepsForward]) xtrain = x[:split] ytrain = y[:split] xtest = x[split: ] ytest = y[split: ] return np.asarray(xtrain), np.asarray(ytrain), np.asarray(xtest), np.asarray(ytest)
方法2:对已生成的object数组做转换
如果你已经生成了object类型的数组,只需要调用np.stack()将所有子数组合并即可,示例代码如下:
# 假设obj_arr是你实际得到的object类型数组 target_arr = np.stack(obj_arr)
转换后的target_arr就是你需要的三维数值数组结构。
内容的提问来源于stack exchange,提问作者Crayfi
相关产品推荐
相关产品推荐

