我试图读取文件夹中的多个文件并从每个文件中获取一个矩阵并将所有矩阵求和。 用于只读取一个文件的脚本,它运行良好(md.MCERunFile Item2d是存在用于数据读取的一些模块):
outfile=md.MCERunfile('/somepath/filename')
rn_matrix=outfile.Item2d('IV', 'Rn_C%i')
Shape=np.shape(rn_matrix)
rn_matrix_float = np.array([]).reshape(0,55)
for x in range(Shape[0]):
row = map(float, rn_matrix[x])
rn_matrix_float=np.vstack([rn_matrix_float, row])
最终输出rn_matrix_float是一个32乘64的numpy数组
现在我试过了:
path = '/somepath/*.xxx'
files = glob.glob(path)
final_matrix=np.zeros((32, 64))
for j in range(0,len(files)):
outfile = md.MCERunfile(files[j])
rn_matrix=outfile.Item2d('IV', 'cut_rec_C%i')
Shape=np.shape(rn_matrix)
for x in range(Shape[0]):
rn_matrix_float = np.array([]).reshape(0,64)
row = map(float, rn_matrix[x])
rn_matrix_float=np.vstack([rn_matrix_float, row])
final_matrix=final_matrix+rn_matrix_float
我认为我的错误是我已经在循环中定义了outfile和rn_matrix,这使得每个rn_matrix_float完全相同而不是从不同的文件中读取数据,因此final_matrix是相同数组的总和。但我不知道如何解决它。
答案 0 :(得分:0)
像这样的迭代
rn_matrix_float = np.array([]).reshape(0,55)
for x in range(Shape[0]):
row = map(float, rn_matrix[x])
rn_matrix_float=np.vstack([rn_matrix_float, row])
应写为附加列表
alist = []
for x in range(Shape[0]):
row = map(float, rn_matrix[x])
alist.append(row)
rn_matrix_float=np.vstack(alist)
附加到列表比重复“连接”数组更快更容易。实际上它可能被写成列表理解,甚至是单行数组操作
rn_matrix_float = rn_matrix.astype(float)
(但这更令人猜测,因为我没有尝试重新创建您的数据。)
同样地,我倾向于收集多文件案例,并在最后做一笔总结
alist2 = []
for j in range(0,len(files)):
outfile = md.MCERunfile(files[j])
rn_matrix=outfile.Item2d('IV', 'cut_rec_C%i')
alist2.append(rn_matrix.astype(float)
final_matrix = np.array(alist2)
print(final_matrix.shape) # check shape
final_matrix = final_matrix.sum(axis=0)
如果中间数组太大,我们可能想要逐步添加。但是首先我认为你应该适应积累多维数组,然后用sum
之类的动作“减少”它们。