用于操作非常大的矩阵的 Python 库

Posted

技术标签:

【中文标题】用于操作非常大的矩阵的 Python 库【英文标题】:Python library for manipulating very large matrices 【发布时间】:2014-06-11 11:30:02 【问题描述】:

有什么好的 Python 库可以处理非常大的矩阵(例如数百万行/列),包括在矩阵生命周期的任何阶段添加行或列的能力?

我查看了pytables 和h5py,但它们都不支持在创建矩阵后添加或删除行或列。

我能找到的唯一其他东西是thesequestions 中提到的 numpy/scipy 中的稀疏矩阵功能。然而,添加/删除行和列的能力似乎是可能的,但官方不支持并且有点 hacky,所以我担心使用真实数据集的性能会很糟糕。此外,它包括几种不同的稀疏矩阵实现,所以我很困惑哪一个最好(例如 lil_matrix vs csc_matrix vs csr_matrix)。

【问题讨论】:

【参考方案1】:

如果您的矩阵是稀疏的,您可以添加或删除行或列,而无需使用scipy.sparse。如果您想删除列(进行列切片),您应该选择csc_matrix,而csr_matrix 应该用于有效的行切片。通常使用coo_matrix 类型创建稀疏矩阵很方便,您可以在其中为每个非零条目指定rowcoldata

m = coo_matrix((data, (row, col)), shape=(nrow, ncol))
m = m.to_csr()[rows_to_keep, :]
m = m.to_csc()[:, cols_to_keep]

rows_to_keep 可以是一个列表或一维数组,其中包含要保留的索引。

如果您需要一个密集矩阵,您也许可以使用numpy.memmap() 数组。要创建一个,您可以这样做:

a = np.memmap('test.memmap', dtype='float64', mode='w+', shape=(1000, 1000))
a.fill(100.)

要阅读你可以做的:

a = np.memmap('a.memmap', dtype='float64', mode='r+', shape=(1000, 1000))

如果要删除或添加行和列,则必须创建第二个 memmap 数组,然后从原始数组中分配所需的列:

b = np.memmap('b.memmap', dtype='float64', mode='w+', shape=(3, 1000))
b = a[[0, 99, 199], :]

这将在b 中保存a 的第一行、第100 行和第200 行以及所有列。

【讨论】:

谢谢,但我收到了TypeError: 'coo_matrix' object does not support indexing。对我来说,任何矩阵类型都无法被索引似乎很奇怪,因为这是矩阵的全部目的......我假设在 scipy 文档中对此进行了解释,但 docs.scipy.org 在过去几天一直处于离线状态。 @Cerin 是的,您必须在使用to_csr()to_csc() 之前进行转换,然后索引应该可以工作... @Cerin 我相信coo_matrix 的目的是提供一种稀疏矩阵,它易于填充和快速转换为其他类型(例如csr_matrixcsc_matrix )

以上是关于用于操作非常大的矩阵的 Python 库的主要内容,如果未能解决你的问题,请参考以下文章

线代矩阵问题

python--Numpy基础操作

如何使用 Python 比较 2 个非常大的矩阵

Python Numpy,学Python不得不削的矩形计算库

如何使用python有效地填充给定一个非常大的表的矩阵?

python的科学计算库都有哪些