大型矩阵处理的Python库

4

有没有一个适用于处理非常大的矩阵(例如数百万行/列)的好的Python库,包括在矩阵的生命周期的任何阶段都可以添加或删除行或列的功能?

我曾经尝试过pytablesh5py,但它们都不支持在创建矩阵后添加或删除行或列。

唯一找到的其他东西是numpy/scipy中稀疏矩阵功能,在这些问题中提到。但是,添加/删除行和列似乎是可能的,但官方不支持并且有点“hacky”,因此我担心在真实数据集上性能会很差。此外,它包括几种不同的稀疏矩阵实现,因此我对哪一种最好感到困惑(例如lil_matrix vs csc_matrix vs csr_matrix)。

1个回答

2
如果您的矩阵是稀疏的,您可以在不使用 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], :]

这将使用所有列,在a中保存第1、100和200行到b中。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接