gpt4 book ai didi

python - 将2D numpy数组转换为3D数组而不循环

转载 作者:行者123 更新时间:2023-11-28 18:18:03 27 4
gpt4 key购买 nike

我有一个形状为 (t*40,6) 的二维数组,我想将其转换为形状为 (t,40,5) 的三维数组,用于 LSTM 的输入数据层。下图显示了有关如何转换的描述。这里,F1..5 是 5 个输入特征,T1...40 是 LSTM 的时间步长,C1...t 是各种训练示例。基本上,对于每个独特的“Ct”,我想要一个“T X F”二维数组,并沿着第 3 个维度连接起来。只要每个 Ct 处于不同维度,我不介意丢失“Ct”的值。

enter image description here

我有以下代码通过遍历每个唯一的 Ct 并在第三维中附加“T X F”二维数组来执行此操作。

# 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”。

最佳答案

由于所有 Ct 的长度都不相同,您别无选择,只能重建一个新 block 。但是 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 is deprecated and will be removed in a future version. The recommended way to represent these types of 3-dimensional data are with a MultiIndex on a DataFrame, via the Panel.to_frame() method

因此,也许使用 df2 是管理数据的推荐方式。

关于python - 将2D numpy数组转换为3D数组而不循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47167305/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com