【发布时间】:2021-03-02 12:04:04
【问题描述】:
我有一个包含 9000 个 CSV 文件的文件夹。每个文件有 5000 行和 12 列。出于深度学习训练的目的,我需要将整个文件(所有文件)转换为形状数组(9000,5000,12)。我在工作中使用此代码:
path=mypath+'//'+li[0]+'.csv' #li is a list containing the filenames, this is for a filtering purpose, please ignore this
df=pd.read_csv(path)
a=np.array(df)
path=mypath+'//'+li[1]+'.csv'
df=pd.read_csv(path)
arr=np.array(df)
a=np.stack((a,arr))
for filename in li[2:]:
path=mypath+'//'+filename+'.csv'
df=pd.read_csv(path)
arr=np.array(df)
if(arr.shape[0]!=4999):
continue
a=np.append(a,[arr],axis=0)
所以,基本上,我将每个 CSV 文件转换为一个数据框,然后将数据框转换为一个数组。最后将数组堆叠在一起。
这个过程花费了太多时间。 1 小时内仅转换了 2000 个文件。有没有更快的方法可以达到我的目的?
抱歉我的编码格式不好,我只是粗略地做,花了太多时间
【问题讨论】:
-
df.values()将为您提供 DataFrame 内的二维(numpy)值数组。它可能比使用np.array(df)创建一个新数组更快且内存消耗更少。 -
追加到一个数组将每次调整该数组的大小。如果可以,请预先分配完整的(空)3D 数组,然后将具有正确索引的 2D 数组就地插入到该 3D 数组中。请注意,内存可能会成为这些数组维度的问题。
-
9000 个带有(整数?浮点数?)数据的 CSV 文件?如果您对输入文件有任何控制权,请考虑使用适当的二进制格式,例如 HDF5。如果涉及浮点数和元数据,这将使事情快得多,而且会好得多。
-
请注意,一小时内 2000 个文件并没有那么糟糕:一个下午在此期间做其他事情并且您的所有数据都已被读取。只需确保以正确的格式存储最终的 3D 数组(例如,前面提到的 HDF5 可以工作)。