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

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

我在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,因为其他数据可能会溢出,但我不知道该怎么做。但是,如果要处理的问题太多,您可能希望将其分开。谢谢您的帮助。

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.