3

I am working in Python and I have a matrix stored in a text file. The text file is arranged in such a format:

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

row_id and col_id are integers and they take values from 0 to n (in order to know n for row_id and col_id I have to scan the entire file first).

there's no header and row_ids and col_ids appear multiple times in the file, but each combination row_id,col_id appears once. There's no explicit value for each combination row_id,col_id , actually each cell value is 1. The file is almost 1 gigabyte of size.

Unfortunately the file is difficult to handle in the memory, in fact, it is 2257205 row_ids and 122905 col_ids for 26622704 elements. So I was looking for better ways to handle it. Matrix market format could be a way to deal with it.

Is there a fast and memory efficient way to convert this file into a file in a market matrix format (http://math.nist.gov/MatrixMarket/formats.html#mtx) using Python?

4

2 に答える 2

2

私が何かを見逃していない限り...

MatrixMarket MM 形式は、ディメンションと「行の列の値」を含む行です。すでに行と列があり、すべての値が 1 の場合は、値を追加するだけで、それで済みます。

のように単純に sed を使用する方が簡単ではないでしょうか

n=`wc -l file`
echo "2257205 122905 $n" > file.mm
cat file | sed -e 's/$/ 1/g' >> file.mm

座標が 1 オフセットの場合、これは機能するはずです。オフセットがゼロの場合は、各座標に +1 を追加し、単に座標を読み取り、それぞれに 1 を追加して、coordx, coordy, "1" を出力する必要があります。シェル、Awk、または python から、ほとんど手間をかけずに実行できます。

Q&D コード (未テスト、ヒントとして生成されたもの、YMMV、およびいくつかの値を計算するためにファイルを前処理する必要がある場合があります):

シェル内

echo "2257205 122905 $n"
cat file | while read x,y ; do x=$((x+1)); y=$((y+1)); echo "$x $y 1" ; done

Pythonでは、多かれ少なかれ...

f=open("file")
lines=f.readlines()
print 2257205, 122905, len(lines)
for l in lines:
    (x,y) = l.split(' ')
    x = int(x) + 1
    y = int(y) + 1
    print x, y, 1

または、何か不足していますか?

于 2015-11-12T09:31:07.937 に答える