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

2024-03-29 14:58:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有大量的数据存储在h5文件中。每个文件都有约1200个子文件夹,其中包含约65k列的表。我需要把数据放在直方图中,我不知道数据的范围。是否有一种方法可以同时读取和填充直方图

我尝试将数据添加到数组中,但如您所见,该数组包含约7800 m元素,用于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_边。这并不理想,因为其他数据可能会溢出,但我不知道怎么做


Tags: 文件数据keyimportforasnpplt
1条回答
网友
1楼 · 发布于 2024-03-29 14:58:30

您可以用内存效率高的方法来完成,但这需要两个过程。 首先,您应该循环遍历数据并找到最小值和最大值。然后,为柱状图选择存储箱数,并计算每个存储箱的值范围

例如,如果您的数据具有范围(0100),并且您想要一个10格柱状图,则范围将为[[0.0,10.0],[10.0,20.0],…[90.0100.0]]

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

然后执行第二个循环,对于数据的每个元素,确定它对应的存储单元以及该存储单元的增量计数器。最后,直方图数组将包含您需要的数据

相关问题 更多 >