我在h5文件中存储了大量数据。每个文件都有约1200个子文件夹,这些子文件夹具有约65k列的表。我需要将数据放在直方图中,但我不知道数据的范围。有没有办法同时读取和填充直方图?
我尝试将数据添加到数组中,但是如您所见,该数组具有10个文件的〜780M个元素:
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]]
然后,您应该创建一个整数数组,其长度等于箱数(这将是您的直方图),并用零初始化。
然后执行第二个循环,为数据的每个元素确定其对应的仓,并为该仓递增计数器。最后,直方图数组将包含您需要的数据。