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に設定します。これにより、これらの列の合計が結果行列に格納されます。つまり、 。
左から掛け算するのはまったく同じ方法で、列だけでなく行にも影響します。
ビニングが粗すぎると感じる場合は、単純なゼロスキームをスムースカーネルに置き換えることができます。結果の行列が疎であることを確認してください。このような行列を設定するにはもう少し手間がかかりますが、難しくありません。あなたはあなたのデータに疎な行列を使用しているので、あなたは疎行列を構築する方法に精通していると思います。
自分で試したことはありませんでしたが、あなたは 'datashader'を調べましたか?役に立つかもしれない。 – reptilicus
ポイントを散布または長方形のコレクションとして個別にプロットすることを検討しましたか? – ImportanceOfBeingErnest
私は通常これを行いますが、この場合は各セルにカウントが含まれているので、セルに値が設定されているかどうかは気にしません。散乱を使ってどのように視覚化するのかは分かりません。 私は 'datashader'をまだ見ていませんが、見てみましょう。 –