Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中高效地创建大型数组?_Python_Out Of Memory - Fatal编程技术网

如何在Python中高效地创建大型数组?

如何在Python中高效地创建大型数组?,python,out-of-memory,Python,Out Of Memory,目前,我有一些轨迹模拟人们在1280x720像素的区域内走动,跨越12小时。存储的记录是x、y坐标和特定记录的时间范围(以秒为单位) 我想制作一个电影序列,展示人们在这12个小时里是如何行走的。为此,我将数据拆分为43200个不同的帧。这对应于每一帧是一秒钟。我的最终目标是在机器学习算法中使用这些数据 这个想法很简单。初始化帧,循环所有x、y坐标,并将其添加到具有各自时间段的阵列帧: >>> frames = np.zeros((43200, 1280, 720,1)) >

目前,我有一些轨迹模拟人们在1280x720像素的区域内走动,跨越12小时。存储的记录是x、y坐标和特定记录的时间范围(以秒为单位)

我想制作一个电影序列,展示人们在这12个小时里是如何行走的。为此,我将数据拆分为43200个不同的帧。这对应于每一帧是一秒钟。我的最终目标是在机器学习算法中使用这些数据

这个想法很简单。初始化帧,循环所有x、y坐标,并将其添加到具有各自时间段的阵列帧:

>>> frames = np.zeros((43200, 1280, 720,1))
>>> for track in tracks:
>>>     for x,y,time in track:
>>>     frames[int(time), y,x] = 255 # to visualize the walking     
理论上,这将创建一个43200帧,可以保存为mp4、gif或其他格式并播放。但是,当我尝试初始化numpy数组时,会出现问题:

>>> np.zeros((43200,720,1280,1))
MemoryError: Unable to allocate 297. GiB for an array with shape (43200, 1280, 720, 1) and data type float64
这很有意义,因为我正在尝试分配:

>>> (43200 * 1280 * 720 * 8) * 1024**3 
296.630859375 
然后我考虑将每个帧保存到一个npy文件中,但每个文件将是7.4MB,总计为320GB

我还考虑将帧拆分为五个不同的阵列:

>>> a = np.zeros((8640, 720, 1280, 1))
>>> b = np.zeros((8640, 720, 1280, 1))
>>> c = np.zeros((8640, 720, 1280, 1))
>>> d = np.zeros((8640, 720, 1280, 1))
>>> e = np.zeros((8640, 720, 1280, 1))

但我认为这似乎很麻烦,而且感觉不是最好的解决方案。这很可能会减慢我的机器学习算法的训练。有更聪明的方法吗?

我只需一次构建几帧视频,然后使用
ffmpeg
将这些帧连接在一起。根据用例的描述,不需要一次将整个视频存储在内存中。

我认为您必须将数据拆分为不同的小数组,这对于机器学习来说可能不会是一个问题

但是,我不知道您是否能够创建这五个numpy阵列,因为它们总共需要297Gb的RAM

我可能会:

  • 使用例如
    matplotlib.pyplot.imsave
    将numpy数组另存为PNG,或
  • 将其存储为短视频,因为一个人在您的视频上的观看次数不会超过此,或者
  • 如果您真的希望整个视频在一个变量中,请降低fps或分辨率
我还要补充一点:

  • 使用
    帧=np.ones((432001280720,1))*255
    ,可以更快地执行您给出的代码片段,因为复杂的
    for
    循环非常昂贵
  • 如果要通过逐个设置其所有系数来创建数组,则使用
    np.empty(shape)
    对其进行初始化会更有效,因为这样可以节省将所有系数设置为零所需的时间,而只需在
    for
    循环中覆盖它们

您能澄清一下您的问题吗?您所描述的数据是按照300GB的规模定义的——如果不是不同的数据,就无法将其缩小。什么样的“不同数据”你会接受?例如,数组当前使用8字节浮点,但仅存储0或255–可以简化为1位0或1。你能接受压缩吗?另一种格式如何,例如稀疏矩阵/仅存储设置或未设置的坐标?帧(无损)可压缩吗?是否确实需要64位浮点?举个例子:(对于你的应用来说,这是必须调整的,但是哪种压缩比是可以达到的,这将是很有趣的)