NumPy是一个非常有用的库,通过使用它,我发现它能够轻松处理非常大的矩阵(10000 x 10000),但是开始处理任何更大的矩阵(试图创建50000 x 50000的矩阵)失败)。显然,这是因为需要大量内存。
是否有一种方法可以以某种方式(没有几个terrabytes的RAM)在NumPy中本地创建大型矩阵(比如说一百万乘一百万)?
Answers:
PyTables和NumPy是必经之路。
PyTables将以HDF格式(可选压缩)将数据存储在磁盘上。我的数据集经常得到10倍压缩,这在处理数千万或几亿行时非常方便。它也非常快。我5岁的笔记本电脑可以以每秒1,000,000行/秒的速度执行类似SQL的GROUP BY聚合的数据。对于基于Python的解决方案来说还不错!
再次作为NumPy数组访问数据非常简单:
data = table[row_from:row_to]
HDF库负责读取相关的数据块并将其转换为NumPy。
numpy.array
s旨在保留在内存中。如果要使用大于RAM的矩阵,则必须解决该问题。您可以遵循至少两种方法:
scipy.sparse.csc_matrix
。它有点alpha,但是http://blaze.pydata.org/似乎正在努力解决这个问题。
有时,一种简单的解决方案是为矩阵项使用自定义类型。根据所需数字的范围,您可以使用手册dtype
,特别是较小的物品。由于Numpy默认情况下会考虑对象的最大类型,因此在许多情况下这可能是一个有用的想法。这是一个例子:
In [70]: a = np.arange(5)
In [71]: a[0].dtype
Out[71]: dtype('int64')
In [72]: a.nbytes
Out[72]: 40
In [73]: a = np.arange(0, 2, 0.5)
In [74]: a[0].dtype
Out[74]: dtype('float64')
In [75]: a.nbytes
Out[75]: 32
并使用自定义类型:
In [80]: a = np.arange(5, dtype=np.int8)
In [81]: a.nbytes
Out[81]: 5
In [76]: a = np.arange(0, 2, 0.5, dtype=np.float16)
In [78]: a.nbytes
Out[78]: 8
据我了解的numpy,不,但是我可能是错的。
我可以为您提出这个替代解决方案:将矩阵写在磁盘上并成块访问。我建议您使用HDF5文件格式。如果透明地需要它,则可以重新实现ndarray接口以将磁盘存储的矩阵分页到内存中。如果您修改数据以使其同步回磁盘,请小心。