将2D numpy数组转换为3D数组而不进行循环

时间:2017-11-07 20:57:01

标签: python pandas numpy multidimensional-array lstm

我有一个2D形状的阵列(t * 40,6),我希望将其转换为LSTM输入数据层的形状(t,40,5)的3D数组。有关如何进行转换的说明如下图所示。这里,F1..5是5个输入功能,T1 ... 40是LSTM的时间步长,C1 ...是各种训练示例。基本上,对于每个独特的“Ct”,我想要一个“T X F”2D阵列,并沿着第三维连接。只要每个Ct处于不同的维度,我不介意丢失“Ct”的值。

enter image description here

我有以下代码通过循环遍历每个唯一的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'。

1 个答案:

答案 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是管理数据的方法。