我在h5文件中存储了大量数据。每个文件具有约1200个子文件夹,这些子文件夹具有带有约65k列的表。我需要将数据放在直方图中,但我不知道数据的范围。有没有办法同时读取和填充直方图?
为此,我尝试将数据添加到数组,但是如您所见,该数组具有约780M个元素,可容纳10个文件。您可以从这里查看我的尝试
import h5py
import numpy as np
import matplotlib.pyplot as plt
aiArr = []
### FILES
for ff in range(0,10):
f= h5py.File('/data/file'+str(ff)+'.h5','r')
### KEYS
for i,key in enumerate(f.keys()):
if ff==0 and i==0:
aiArr = np.array(f[key]['AI'][()])[0]
else:
aiArr = np.append( aiArr , np.array(f[key]['AI'][()])[0] ,axis=0 )
plt.hist(aiArr,bins='auto')
plt.savefig('hist_0.png')
然后我尝试在key
循环后制作临时直方图,然后求和为hist_of_file += np.histogram(temp_hist,bins=bin_edges)
,但它抱怨为ValueError: operands could not be broadcast together with shapes (1235,) (1234,)
,我还必须在不理想的第一个数据输入之后定义bin_edges,因为其他数据可能会溢出,但我不知道该怎么做。但是,如果要处理的问题太多,您可能希望将其分开。谢谢您的帮助。
您可以以节省内存的方式执行此操作,但是需要两次通过。首先,您应该遍历数据并找到最小值和最大值。然后,为直方图选择bin的数量,并计算每个bin的值范围。
例如,如果您的数据的范围是(0,100),而您想要一个10 bin直方图,则范围将是[[0.0,10.0],[10.0,20.0],... [90.0,100.0]]
然后,您应该创建一个整数数组,其长度等于箱数(这将是您的直方图),并用零初始化。
然后执行第二个循环,为数据的每个元素确定其对应的仓,并为该仓递增计数器。最后,直方图数组将包含您需要的数据。