我有一个2D形状的阵列(t * 40,6),我希望将其转换为LSTM输入数据层的形状(t,40,5)的3D数组。有关如何进行转换的说明如下图所示。这里,F1..5是5个输入功能,T1 ... 40是LSTM的时间步长,C1 ...是各种训练示例。基本上,对于每个独特的“Ct”,我想要一个“T X F”2D阵列,并沿着第三维连接。只要每个Ct处于不同的维度,我不介意丢失“Ct”的值。
我有以下代码通过循环遍历每个唯一的Ct,并在第三维中附加“T X F”2D数组来完成此操作。
# load 2d data
data = pd.read_csv('LSTMTrainingData.csv')
trainX = []
# loop over each unique ct and append the 2D subset in the 3rd dimension
for index, ct in enumerate(data.ct.unique()):
trainX.append(data[data['ct'] == ct].iloc[:, 1:])
然而,有超过1,800,000个这样的Ct,所以这使得循环每个独特的Ct非常慢。寻找更快地完成此操作的建议。
编辑:
data_3d = array.reshape(t,40,6)
trainX = data_3d[:,:,1:]
这是原始问题的解决方案。
更新问题还有一个问题:T1 ... 40个时间步长可以有最大步数= 40,但也可能小于40。剩余的值可以是40个可用插槽中的'np.nan'。
答案 0 :(得分:1)
由于所有Ct的长度都不相同,因此除了重建新块之外别无选择。
但data[data['ct'] == ct]
的使用可能是O(n²)
,因此这是一种不好的方法。
这是使用Panel
的解决方案。 cumcount
对每个Ct行重新编号:
t=5
CFt=randint(0,t,(40*t,6)).astype(float) # 2D data
df= pd.DataFrame(CFt)
df2=df.set_index([df[0],df.groupby(0).cumcount()]).sort_index()
df3=df2.to_panel()
这会使用Nan
自动填充缺失的数据。但它警告说:
DeprecationWarning: Panel已弃用,将在以后的版本中删除。 表示这些类型的三维数据的推荐方法是通过Panel.to_frame()方法在DataFrame上使用MultiIndex
因此,建议使用df2
是管理数据的方法。