2017-04-06 16 views
0

私は現在、非常に大きな行列を作成しようとしています。メモリ効率の良い方法でこれを行う方法がわかりません。大きなゼロの行列を作成するメモリ効率的な方法行列のpython

私は小さいケース(2750086X300)のためにうまくいきましたnumpyを使用しようとしていました。 しかし、大きなサイズのもの、2750086X1000があります。

私はそれをintから作り出していますが、float値を追加するので、そのcldがどのように影響するのかは不明です。

私はスパースゼロ充填配列を作ることについて何かを見つけようとしましたが、cldntはここや他の場所で大きなトピック/質問/提案を見つけました。

誰でも良いアドバイスをいただけましたか?私は現在Pythonを使用していますので、私はpythonic解決策を探していますが、他の言語を試してみたいと思っています。

Thxを


編集:行列を作ることに成功したが深く、それを通過する時間を増加アドバイスのための

THX、私が試しましscipy.sparse.csr_matrix。私がやっている何の

相続人の種類:関数は、その行にかなりのベクトル演算機能である

matrix = scipy.sparse.csr_matrix((df.shape[0], 300)) 
## matrix = np.zeros((df.shape[0], 

for i, q in enumerate(df['column'].values):  

    matrix[i, :] = function(q) 

ここで、np.zerosでループを実行すると、10分ほどで簡単に実行できます。

今、私がscipyの疎なマトリックスで同じことをしようとすると、約50時間かかります。それはそれほど妥当ではありません。

アドバイスはありますか?


編集2:

scipy.sparse.lil_matrixはトリック

は、ループでは約20 minutを取り、np.zeros

Thxをより道少ないメモリを使用しました。


編集3:まだ

メモリ高価。マトリックスにデータを保存しないことにしました。一度に1行ずつ処理します。関連する値/メトリックを取得し、元のdfに値を格納し、再度実行します。

+0

'np.zeros((2750086、1000))'は、ゼロまたは実数で満たされていても、あなたの記憶には大きすぎる可能性があります。 0.1%以外の零点しかない疎な行列が当てはまるかもしれません。しかし、この配列で何をやっていますか?それを要素で満たすことは永遠に続くでしょう。そして、メモリをほぼ満たしている配列を持つ数学では、一時的なバッファを作成するときにメモリエラーが発生します。 – hpaulj

+0

32ビットの数値を使うには、少なくとも「2750086 * 1000 * 1e-9 * 4 = 11.000344ギガバイト」が必要です。完全にクレイジーではないが、かなり大きい。より多くのRAMを取得したり、疎な表現で作業したりすることができます。 –

+0

'[scipy] sparse'を検索し、' [scipy] 'のスパース行列パッケージに関する質問を見つけてください。 'lil'、' coo'、 'csr'も一意の文字列として動作します。そして、あなたが 'scikit-learn'のようなパッケージの学習やテストを行っているなら、役に立つかもしれません。素晴らしい答えのために – hpaulj

答えて

4

scipy.sparse.csr_matrix試してみてください。

from scipy.sparse import * 
from scipy import * 
a=csr_matrix((2750086,1000), dtype=int8) 

をあなたがしなければ次にa、例えば

<2750086x1000 sparse matrix of type '<class 'numpy.int8'>' 
    with 0 stored elements in Compressed Sparse Row format> 

です:

from scipy.sparse import * 
from scipy import * 
a=csr_matrix((5,4), dtype=int8).todense() 
print(a) 

は、あなたが得る:

[[0 0 0 0] 
[0 0 0 0] 
[0 0 0 0] 
[0 0 0 0] 
[0 0 0 0]] 

もう一つの選択肢は、これは(a[1,1]=2のような)の要素を設定するためのより効率的であるように思わscipy.sparse.lil_matrix

a = scipy.sparse.lil_matrix((2750086,1000), dtype=int8) 

を使用することです。

+0

thx。私は質問を更新/ upvoted – epattaro

+0

リルマトリックスを試して、良い解決策に思われる。どうも。 – epattaro

関連する問題