2017-02-13 35 views
1

私はヒートマップとしてプロットしたいヒストグラムを含む大きなスパース行列を持っています。この場合スパース行列のプロットヒートマップ

import matplotlib.pyplot as plt 
plt.imshow(h.T, interpolation="nearest", origin="lower") 
plt.colorbar() 
plt.savefig("corr.eps") 

を私はしかし、完全な行列は私がメモリに保持するためには大きすぎる189,940x189,940の大きさを持っているという問題があり、次のように通常、私は単純にフルマトリックス(h)をプロットします。スパースパターン(例えばpython matplotlib plot sparse matrix pattern)をプロットする記事は見つかりましたが、ヒートマップをプロットする方法はまだありません。ヒートマップを密度の高いマトリックスに変換することはありません。それは可能ですか? (または、RAMを使い果たすことなくそれをプロットする別の方法がありますか?)私の疎な行列は現在、lilmatrix(scipy.sparse.lil_matrix)です。

+0

自分で試したことはありませんでしたが、あなたは 'datashader'を調べましたか?役に立つかもしれない。 – reptilicus

+0

ポイントを散布または長方形のコレクションとして個別にプロットすることを検討しましたか? – ImportanceOfBeingErnest

+0

私は通常これを行いますが、この場合は各セルにカウントが含まれているので、セルに値が設定されているかどうかは気にしません。散乱を使ってどのように視覚化するのかは分かりません。 私は 'datashader'をまだ見ていませんが、見てみましょう。 –

答えて

1

1つの考え方は、スパース操作を使用してダウンサンプリングすることです。

data = data.tocsc()  # sparse operations are more efficient on csc 
N, M = data.shape 
s, t = 400, 400   # decimation factors for y and x directions 
T = sparse.csc_matrix((np.ones((M,)), np.arange(M), np.r_[np.arange(0, M, t), M]), (M, (M-1) // t + 1)) 
S = sparse.csr_matrix((np.ones((N,)), np.arange(N), np.r_[np.arange(0, N, s), N]), ((N-1) // s + 1, N)) 
result = S @ data @ T  # downsample by binning into s x t rectangles 
result = result.todense() # ready for plotting 

このコードスニペットは、単純なビニングを実装していますが、より洗練されたフィルタを組み込むように洗練することができます。ビニング行列は、binned id行列です。たとえば、j // s = i else if 0の場合、S_ij = 1です。

さらに詳しい説明。オリジナルの行列は非常に大きいので、出力を視覚的に目立つ差異なしにダウンサンプリングすることができます。

最初に密な表現を作成せずにダウンサンプリングする方法が問題です。 1つの可能な答えは、マトリックス乗算の観点からビニングを表現し、次に疎マトリックス乗法を使用することです。

したがって、カラムビンに次にビニングマトリクスTで右からT対応の列を元のデータとを乗算する場合、特にTの列の数は、ダウンサンプリングデータがになりますどのように多くの画素を決定しますx方向。 Tの各列は、対応するビンに入るものとそうでないものを決定します。この例では、(元の行列の)隣接する列を符号化するいくつかの要素を1に設定し、残りを0に設定します。これにより、これらの列の合計が結果行列に格納されます。つまり、 。

左から掛け算するのはまったく同じ方法で、列だけでなく行にも影響します。

ビニングが粗すぎると感じる場合は、単純なゼロスキームをスムースカーネルに置き換えることができます。結果の行列が疎であることを確認してください。このような行列を設定するにはもう少し手間がかかりますが、難しくありません。あなたはあなたのデータに疎な行列を使用しているので、あなたは疎行列を構築する方法に精通していると思います。

+0

この度はありがとうございます。ここでサンプリングがどのように機能するのか、サンプリングされるものをどのように変更するのかをもう少し説明できますか?私はまだそれをかなりフォローしていないのではないかと心配している。 –

+0

私はしようとしました。更新された投稿を見てください。 –

+0

私はpython2.7を使用しています(私の投稿からは分かりませんでした)ので、 '@'演算子は存在しません。この記事(https://stackoverflow.com/questions/34142485/difference-between-numpy-dot-and-python-3-5-matrix-multiplication)によると、それは 'np.matmul'と同等です'np.dot'。それはあなたが意図したものですか? –

関連する問題