使用Python和NumPy处理非常大的矩阵

97 投票
11 回答
121554 浏览
提问于 2025-04-15 12:32

NumPy 是一个非常有用的库。我在使用它的过程中发现,它可以轻松处理很大的矩阵,比如 10000 x 10000 的矩阵,但当矩阵变得更大时,比如 50000 x 50000,就会出现问题,创建这样的矩阵会失败。这显然是因为需要的内存太大了。

有没有办法在 NumPy 中原生创建超大的矩阵,比如 100 万 x 100 万,而不需要几TB的内存呢?

11 个回答

31

你可以使用numpy.memmap来将磁盘上的文件映射到内存中。对于较新的Python版本和64位的电脑,你应该有足够的地址空间,这样就不需要把整个文件都加载到内存里。操作系统会只把文件的一部分保留在内存中。

62

numpy.array 是用来在内存中存储数据的。如果你想处理比你的内存还大的矩阵,就得想办法解决这个问题。这里有两种方法可以尝试:

  1. 尝试更有效的矩阵表示方式,利用你矩阵的特殊结构。例如,正如其他人提到的,对于稀疏矩阵(里面有很多零的矩阵),可以使用一些高效的数据结构,比如 scipy.sparse.csc_matrix
  2. 修改你的算法,使其在子矩阵上工作。你可以只从硬盘读取当前计算所需的矩阵块。设计用于集群计算的算法通常是按块处理的,因为数据分散在不同的计算机上,只有在需要时才会传输。例如,Fox算法用于矩阵乘法(PDF文件)
94

使用PyTables和NumPy是个不错的选择。

PyTables会把数据存储在硬盘上,格式是HDF,还可以选择压缩。我的数据集通常能压缩到原来的十分之一,这在处理几千万或上亿行数据时非常有用。而且速度也很快;我那台五年的老笔记本电脑每秒能处理100万行数据,进行类似SQL的分组汇总。这对于一个基于Python的解决方案来说,表现得不错!

以NumPy的recarray格式访问数据也非常简单:

data = table[row_from:row_to]

HDF库会自动处理读取相关的数据块,并转换成NumPy格式。

撰写回答