如何在Python中高效地创建大型数组?
目前,我有一些轨迹模拟人们在1280x720像素的区域内走动,跨越12小时。存储的记录是x、y坐标和特定记录的时间范围(以秒为单位) 我想制作一个电影序列,展示人们在这12个小时里是如何行走的。为此,我将数据拆分为43200个不同的帧。这对应于每一帧是一秒钟。我的最终目标是在机器学习算法中使用这些数据 这个想法很简单。初始化帧,循环所有x、y坐标,并将其添加到具有各自时间段的阵列帧:如何在Python中高效地创建大型数组?,python,out-of-memory,Python,Out Of Memory,目前,我有一些轨迹模拟人们在1280x720像素的区域内走动,跨越12小时。存储的记录是x、y坐标和特定记录的时间范围(以秒为单位) 我想制作一个电影序列,展示人们在这12个小时里是如何行走的。为此,我将数据拆分为43200个不同的帧。这对应于每一帧是一秒钟。我的最终目标是在机器学习算法中使用这些数据 这个想法很简单。初始化帧,循环所有x、y坐标,并将其添加到具有各自时间段的阵列帧: >>> frames = np.zeros((43200, 1280, 720,1)) >
>>> 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
我可能会:
- 使用例如
将numpy数组另存为PNG,或matplotlib.pyplot.imsave
- 将其存储为短视频,因为一个人在您的视频上的观看次数不会超过此,或者
- 如果您真的希望整个视频在一个变量中,请降低fps或分辨率
- 使用
,可以更快地执行您给出的代码片段,因为复杂的帧=np.ones((432001280720,1))*255
循环非常昂贵for
- 如果要通过逐个设置其所有系数来创建数组,则使用
对其进行初始化会更有效,因为这样可以节省将所有系数设置为零所需的时间,而只需在np.empty(shape)
循环中覆盖它们for