如何拆分成块(子矩阵),或处理巨大的矩阵,从而在numpy上出现内存错误?

时间:2019-03-01 13:56:44

标签: python python-3.x numpy matrix large-data

我有一个非常大的矩阵,不能简单地放入内存中。我必须使用的矩阵具有483798149136个元素,这意味着4,830亿个浮点数。

我正在考虑的方法是将这个巨大的矩阵以某种方式拆分为适合内存的不同子矩阵,对这些子矩阵执行pooling操作,然后将它们全部重新组合以重建希望适合的原始矩阵完成所有池操作后进入内存。

如果我错了,请纠正我,这种方法只是我想到的一个主意,这是好是坏,我不知道。如果您有更好的替代想法,欢迎提出任何建议。

用于重现此矩阵的代码为:

a = np.arange(695556).reshape(834,834)
np.meshgrid(a,a)

在同一站点的其他文章中,我一直在阅读thisthis的帖子,但是它们都无法提供对此类问题的真正解决方案,他们只是给出模糊的建议。 >

我的问题是:

  1. 我的拆分和合并方法是否可行,或者还有其他更好的方法吗?

  2. 如何(以代码形式)如何将此矩阵拆分为多个部分(如Windows或多维内核),并稍后再重新构建

  3. 是否有某种方式可以以numpy的形式处理矩阵,以对矩阵层执行运算,例如乘法,加法等...

  4. Python中是否有一个特定的程序包可以帮助处理此类矩阵问题

编辑

由于一些用户向我询问了整个操作的目标,因此我将提供一些信息:

我正在做一些3D打印项目。在此过程中,有一束激光使金属粉末熔化,从而形成复杂的金属片。在这些工件中有一层,然后激光逐层熔化金属。

我有3个csv文件,每个文件包含834 x 834矩阵。当激光束通过粉末床并熔化金属时,第一个矩阵包含X轴的坐标值,第二个矩阵对于Y轴,第三个矩阵代表激光在同一像素点站立熔化的时间。这些值以秒表示。

所以我有穿过X和Y轴的激光的坐标,以及熔化每个点所花费的时间。

此矩阵来自每个制造的零件的截面图像。

问题在于,某个像素的温度以及激光在该像素处停留的时间会对激光到达n个像素产生影响。所以我想创建一个距离矩阵,告诉我图像的每个像素彼此之间在欧几里德距离上有何不同或相似。

这就是为什么如果我有例如2834 x 834个矩阵,我需要创建一个695556 x 695556的矩阵,矩阵中每个单点之间的距离都彼此对应。这就是为什么它是如此之大而无法放入内存的原因。

我不知道我是否提供了太多信息,或者我的解释是否混乱。您可以问任何需要的内容,我会尽力弄清楚,但主要要点是我需要在ordr中创建这个巨大的距离矩阵,以了解像素之间的数学距离,然后才能了解像素中发生的事情之间的关系。印刷件的某个点,以及在其他点需要发生什么以避免制造缺陷。

非常感谢您

1 个答案:

答案 0 :(得分:0)

毕竟,我想出了一种解决问题的方法。使用dask可以轻松处理这些庞大的矩阵。 Dask是一个python库,可将分布式计算和数据划分为多个块以优化内存使用。它非常方便,因为它确实允许您以真正的低计算和内存成本处理字面上的海量数据,显然,它不如内存计算那么快,但是我想人们对此非常高兴。

此软件包已非常优化,并且经常更新。最好的是,它具有numpy / pandas sintax,它与数据框的工作方式也与数组相同,并且如果您知道pandas / numpy的话,就会感觉像在家一样。

您可以像这样创建一个分布式分布式数组:

import numpy as np
import dask.array as da

Y = da.random.normal(size=(695556, 695556),
                         chunks=(1000, 1000))

然后,您可以像这样对它执行一些操作:

y = Y.mean(axis=0)[0:100].compute()

此外,如果您使用memory_profiler package,还可以监视内存和CPU使用率,并查看计算中消耗的大量数据消耗了多少内存。

我发现了一些实用的示例,非常具有说明性,here

此外,可以在here中找到此库中的解释性数组范围。

最后,是有关Python 3.X here中的高性能计算的指南。

希望这对遇到同样问题的人有所帮助。