2017-12-09 7 views
0

私は疎な行列1000×12000列を持っています。 は、この形式次のディスクファイルに書きたい:行によって 、まったくゼロのコラム:ファイル上にscipy疎行列を書くには

col_id1:値col_id2:値.... col_id2:値....

があります速い方法で行う方法? (手動反復なし)

+1

'lil'形式の' .rows'属性と 'data'属性を見てください。それはリストの形であなたの情報を持っています。それでも、各行を繰り返して書式を設定して書き込む必要があります。 – hpaulj

+0

わずかな迂回路として、希薄なマトリックスのマトリックス市場フォーマットを調べることをお勧めします。 scipyがすでにそれらを読み書きするための関数を含んでいない他の理由がない場合は、scipy.io.mmwrite/mmreadを参照してください。 – janneb

答えて

1

Iコメントで提案ものの例:ループを使用してスペックに応じ

In [6]: Ml = M.tolil() 
In [7]: Ml.rows 
Out[7]: 
array([list([5, 8]), list([9]), list([7, 8]), list([2, 6]), list([1]), 
     list([1, 6, 8]), list([6, 7, 9]), list([3, 5, 8, 9]), list([8]), 
     list([8])], dtype=object) 
In [8]: Ml.data 
Out[8]: 
array([list([0.4846731927245771, 0.5702631830799726]), 
     list([0.6146583299803253]), 
     list([0.7090013427361257, 0.5276358934648013]), 
     list([0.8090255179222732, 0.6991957521702542]), 
     list([0.5176471479060225]), 
     list([0.19185739496268694, 0.3564088703236009, 0.2264459826535451]), 
     list([0.8158366018134895, 0.5267621547920701, 0.7751363190143352]), 
     list([0.5854011718424482, 0.7282733590496102, 0.49527122544858804, 0.12163402858941941]), 
     list([0.8940803471238159]), list([0.9746504287533381])], dtype=object) 

形式線:

In [2]: from scipy import sparse 
In [3]: M = sparse.random(10,10,.2) 
In [4]: M 
Out[4]: 
<10x10 sparse matrix of type '<class 'numpy.float64'>' 
    with 20 stored elements in COOrdinate format> 
In [5]: print(M) 
    (1, 9) 0.61465832998 
    (8, 8) 0.894080347124 
    (2, 7) 0.709001342736 
    (3, 2) 0.809025517922 
    (9, 8) 0.974650428753 
    (7, 8) 0.495271225449 
    (5, 6) 0.356408870324 
    (0, 8) 0.57026318308 
    (3, 6) 0.69919575217 
    (5, 8) 0.226445982654 
    (5, 1) 0.191857394963 
    (7, 9) 0.121634028589 
    (6, 6) 0.815836601813 
    (7, 3) 0.585401171842 
    (6, 7) 0.526762154792 
    (6, 9) 0.775136319014 
    (4, 1) 0.517647147906 
    (0, 5) 0.484673192725 
    (7, 5) 0.72827335905 
    (2, 8) 0.527635893465 

lilフォーマットが行によって値を収集リストの理解度:

In [9]: for r,d in zip(Ml.rows, Ml.data): 
    ...:  print(' '.join(['%s:%s'%(r1,d1) for r1,d1 in zip(r,d)])) 
    ...:  
5:0.4846731927245771 8:0.5702631830799726 
9:0.6146583299803253 
7:0.7090013427361257 8:0.5276358934648013 
2:0.8090255179222732 6:0.6991957521702542 
1:0.5176471479060225 
1:0.19185739496268694 6:0.3564088703236009 8:0.2264459826535451 
6:0.8158366018134895 7:0.5267621547920701 9:0.7751363190143352 
3:0.5854011718424482 5:0.7282733590496102 8:0.49527122544858804 9:0.12163402858941941 
8:0.8940803471238159 
8:0.9746504287533381 

ファイルの書き込み行を印刷に置き換えます。

私たちは「手動で」ループしていますが、データ要素へのアクセス時間は比較的高速です。インデックスM[i,j]よりはるかに高速ですが、とにかくcooフォーマットでは不可能です。 csrフォーマット属性を介し

高速行アクセスも可能であるが、そのデータが格納されている方法のもう少し知識を必要とします。

あなたの:の構文は一般的ではないので、そのフォーマットは関係なく行います。このファイルをどのように読もうとしていますか?

+0

ありがとうございます。ファイルは外部アプリで読み込もうとしています。 CSRフォーマットでも同じことができますか? 1)は、Pythonインタプリタのメモリを殺し、メモリに非常に多くのリストを格納されていませんか? – Tensor

+0

@Tensorは、誰年代はLILがCSRよりもメモリ豚のより多くのことについて不平を言っていません。しかし、はい、 'indptr'を使って' indices'と 'data'属性をスライスすることができます。これは、CSR行の繰り返しに関するSOの質問でカバーされています。 – hpaulj

関連する問題