从文本文件到市场矩阵格式

Luc*_*ron 3 python matrix sparse-matrix

我在Python工作,我有一个存储在文本文件中的矩阵.文本文件以这样的格式排列:

row_id,col_id
row_id,col_id
...
row_id,col_id

row_id和col_id是整数,它们取值从0到n(为了知道n为row_id和col_id,我必须先扫描整个文件).

没有标题,row_ids和col_ids在文件中多次出现,但每个组合row_id,col_id出现一次.每个组合row_id,col_id没有明确的值,实际上每个单元格值为1.文件的大小几乎是1千兆字节.

不幸的是,文件很难在内存中处理,事实上,它是2257205 row_ids和122905 col_ids用于26622704元素.所以我一直在寻找更好的方法来处理它.矩阵市场格式可能是一种处理它的方式.

有没有一种快速且内存有效的方法使用Python 将此文件转换为市场矩阵格式(http://math.nist.gov/MatrixMarket/formats.html#mtx)的文件?

Eri*_*got 6

有一种处理这种矩阵的快速且内存有效的方法:使用SciPy提供稀疏矩阵(这是Python中事实上的标准,用于此类事情).

对于大小的矩阵NN:

from scipy.sparse import lil_matrix

result = lil_matrix((N, N))  # In order to save memory, one may add: dtype=bool, or dtype=numpy.int8

with open('matrix.csv') as input_file:
    for line in input_file:
        x, y = map(int, line.split(',', 1))  # The "1" is only here to speed the splitting up
        result[x, y] = 1
Run Code Online (Sandbox Code Playgroud)

(或者,在一行而不是两行:) result[map(int, line.split(',', 1))] = 1.

1给出的参数split()就是在解析坐标时加快速度:它指示Python在找到第一个(也是唯一的)逗号时停止解析该行.这可能很重要,因为您正在读取1 GB文件.

根据您的需要,您可能会发现SciPy提供的其他六种稀疏矩阵表示中的一种更适合.

如果您想要更快但也更耗费内存的阵列,则可以使用result = numpy.array(…)(使用NumPy).