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

4 投票
1 回答
718 浏览
提问于 2025-04-18 04:15

有什么好的Python库可以处理非常大的矩阵(比如有几百万行或列),并且可以在矩阵的任何阶段添加行或列吗?

我看过pytablesh5py,但这两个库在创建矩阵后都不支持添加或删除行和列。

我找到的唯一其他选择是numpy/scipy中的稀疏矩阵功能,相关信息在这些 问题中提到过。不过,虽然看起来可以添加或删除行和列,但这并不是官方支持的功能,感觉有点不太靠谱,所以我担心在处理真实数据集时性能会很差。而且,它包含几种不同的稀疏矩阵实现,我也搞不清楚哪个最好(比如lil_matrix、csc_matrix和csr_matrix)。

1 个回答

2

如果你的矩阵是稀疏的,你可以很方便地添加或删除行或列,而不需要使用复杂的 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行,所有的列都会保留。

撰写回答