读取大量数据并不断更新直方图

问题描述 投票:0回答:1

我在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。这是不理想的,因为其余数据可能会溢出它,但我不知道该怎么办。

python arrays numpy bigdata histogram
1个回答
0
投票

您可以以节省内存的方式执行此操作,但是需要两次通过。首先,您应该遍历数据并找到最小值和最大值。然后,为直方图选择bin的数量,并计算每个bin的值范围。

例如,如果您的数据的范围是(0,100),而您想要一个10 bin直方图,则范围将是[[0.0,10.0],[10.0,20.0],... [90.0,100.0]]

然后,您应该创建一个整数数组,其长度等于箱数(这将是您的直方图),并用零初始化。

然后执行第二个循环,为数据的每个元素确定其对应的仓,并为该仓递增计数器。最后,直方图数组将包含您需要的数据。

© www.soinside.com 2019 - 2024. All rights reserved.