用于操作非常大的矩阵的 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
类型创建稀疏矩阵很方便,您可以在其中为每个非零条目指定row
、col
和data
:
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_matrix
或csc_matrix
)以上是关于用于操作非常大的矩阵的 Python 库的主要内容,如果未能解决你的问题,请参考以下文章