【发布时间】:2020-04-25 11:20:39
【问题描述】:
一些背景
用于从多个文件中读取数据并将其堆叠以形成模仿 numpy 堆叠的二维数组列表的代码:
import glob
import pandas as pd
import numpy as np
def read_file(files):
data = []
for i in range( len(files) ):
try:
ehists.append( pd.read_csv(files[i], delimiter = "\t", compression='gzip', header=None).to_numpy() )
except pd.errors.EmptyDataError:
pass
return data
foldername = "datafolder"
### reading files with names file1, file2.......
files = glob.glob("./"+foldername+"/file*")
3dData = read_file(files)
主查询
为简单起见,假设每个文件有 3 列,但长度(行数)不同。第 1 列代表时间,第 2 列和第 3 列是当时的一些数据点。所以,一个典型的文件看起来有点像:
10 0.34 1.37
15 0.39 1.42
20 0.45 1.47
25 0.57 1.53
30 0.68 1.62
35 0.82 1.89
40 0.92 1.97
为了绘制所有文件在不同时间的第 2 列值的分布直方图,我使用以下代码解析数组列表:
import matplotlib.pyplot as plt
t_end = 1000
t = np.arange(0, t_end, 1)
y = []
for time in t:
y_t = []
for i in range( len(3dData) ): ## iterating over files(2d-arrays)
for j in range( np.shape(3dData[i])[0] ): ## iterating over rows in the 2d-array
if 3dData[i][j,0] == time:
y_t.append( 3dData[i][j,1] )
y.append( y_t )
## Hist of values at t=10
t0 = 10
plt.hist(y[t0])
plt.show()
我想要达到的目标是为我工作。但是,由于列表中有大约 100000 个二维数组,因此上面的代码需要很长时间才能运行。我觉得对象类型的不一致导致在解析数据时处理速度较慢。 (我的想法是否正确,并且)有没有办法堆叠不同形状的二维数组而不必填充二维数组数据?
P.S.:如果需要,我可以提供更多信息,我非常乐意收到有关如何使此代码更高效的建议/建议。
感谢您的时间和精力!
【问题讨论】:
-
请阅读How to Ask 以及如何提供minimal reproducible example。如果它能够解决特定的代码问题并且不那么笼统,您的问题需要更加集中和最好
-
@Tomerikoo 感谢您的意见,我编辑了问题以包含更多详细信息。