2016-06-28 20 views
0

我在python中工作,我遇到了一个问题:我必须初始化一个巨大的数组(21 x 2000 x 4000矩阵),以便我可以复制它的子矩阵。 问题是我希望它非常快,因为它是用于实时应用程序,但是当我运行numpy.ones((21,2000,4000))时,创建此矩阵需要大约一分钟的时间。 当我运行numpy.zeros((21,2000,4000))时,它是即时的,但只要我复制子矩阵,它需要一分钟,而在第一种情况下,复制部分是即时的。用numpy初始化一个大矩阵的方式太长

有没有更快的方式来初始化一个巨大的数组?

+0

*巨大*是你的关键词,无论你做什么,它都需要一段时间设置1.68亿分,所以最好只做一次...... –

+0

我认为这种差异来自'numpy.zeros似乎创建了一个稀疏矩阵,比实际的矩阵要轻。因此,当您复制它时,它将创建实际的矩阵,这需要一分钟,因为它是一个巨大的矩阵(168M单元)。我认为你不会有更快的方式来初始化这种尺寸的矩阵。 – ysearka

回答

1

我想没有更快的方法。您构建的矩阵非常大(8字节的float64 x 21 x 2000 x 4000 = 1.25 GB),并且可能占用了系统中大部分物理内存;因此,等待的一分钟可能是因为操作系统必须将其他东西分页以腾出空间。您可以通过在您分配内容并观看内存使用和分页时观看top或类似内容(例如,系统监视器)来检查。

numpy.zeros在您调用它时似乎是即时的,因为内存是由操作系统懒洋洋地分配的。但是,只要您尝试使用它,操作系统实际上必须在某处适合该数据。请参阅Why the performance difference between numpy.zeros and numpy.zeros_like?

您是否可以重构代码,以便仅创建您打算复制的子矩阵,而不必创建大矩阵?

+0

感谢您的澄清。可能不可能不使用巨大矩阵,这是一个包含21个通道的大图像(实际上,深度学习中它实际上有21个类别,具有逻辑像素标记的概率)。 子矩阵是神经网络的输出,它取决于层中输入的步幅大小...... –

+0

在这种情况下,正如@CSᵠ所述,您可能能够在输入之前预先分配矩阵进入您的应用程序的实时循环。如果您可以小心总是重新使用分配的内存,则只需等待一分钟。 – wildwilhelm

+0

如果我假设你正在分配'float64',你也可以尝试改变'dtype'。使用'float32'只需要640 MB,这可能会更快... – wildwilhelm