用于处理非常大的矩阵的Python库

时间:2014-04-25 16:28:03

标签: python numpy matrix scipy large-data

什么是用于处理非常大的矩阵(例如数百万行/列)的优秀Python库,包括在矩阵的生命的任何阶段添加行或列的能力?

我查看了pytablesh5py,但是在创建矩阵后都不支持添加或删除行或列。

我能找到的另一件事是these questions中提到的numpy / scipy中的稀疏矩阵功能。但是,添加/删除行和列的能力似乎是可能的,但是官方不支持和有点hacky,所以我担心真实数据集的性能会很糟糕。此外,它包括几个不同的稀疏矩阵实现,所以我混淆哪一个是最好的(例如lil_matrix vs csc_matrix vs csr_matrix)。

1 个答案:

答案 0 :(得分: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可以是列表,也可以是保留索引的1-D数组。

如果需要密集矩阵,可以使用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行以及所有列。