9

信号処理アプリケーションに matplotlib を使用していますが、大規模なデータ セットで詰まることに気付きました。これは、使用可能なアプリケーションにするために本当に改善する必要があるものです.

私が探しているのは、matplotlib にデータをデシメーションさせる方法です。それを有効にする設定、プロパティ、またはその他の簡単な方法はありますか? これを実装する方法の提案は大歓迎です。

いくつかのコード:

import numpy as np
import matplotlib.pyplot as plt

n=100000 # more then 100000 points makes it unusable slow
plt.plot(np.random.random_sample(n))
plt.show()

いくつかの背景情報

以前は、大規模なデータセットをプロットする必要がある大規模な C++ アプリケーションで作業していました。この問題を解決するために、次のようにデータの構造を利用していました。

ほとんどの場合、ライン プロットが必要な場合、データは順序付けられ、多くの場合、等距離になります。等距離の場合は、データ配列の開始インデックスと終了インデックスをズーム四角形と逆​​軸変換から直接計算できます。順序付けられているが等距離でない場合は、二分探索を使用できます。

次に、ズームされたスライスがデシメートされます。データが順序付けられているため、1 ピクセル内に収まる点のブロックを単純に反復できます。そして、ブロックごとに平均、最大、最小が計算されます。1 ピクセルの代わりに、プロットにバーを描画します。

例: x 軸が順序付けられている場合、ブロックごとに垂直線が描画され、平均が異なる色で表示される可能性があります。

エイリアシングを避けるために、プロットは係数 2 でオーバーサンプリングされます。

散布図の場合、プロットの順序は重要ではないため、データを並べ替えて並べ替えることができます。

このシンプルなレシピの良いところは、拡大すればするほど速くなるということです。私の経験では、データがメモリに収まる限り、プロットは非常に反応が良いままです。たとえば、1,000 万点の時刻歴データを 20 プロットしても問題ありません。

4

2 に答える 2

1

プロットする前にデータを間引く必要があるようです

import numpy as np
import matplotlib.pyplot as plt

n=100000 # more then 100000 points makes it unusable slow
X=np.random.random_sample(n)
i=10*array(range(n/10))
plt.plot(X[i])
plt.show()
于 2013-12-13T02:54:12.947 に答える
0

たとえば、スパース データをデシメートすると、すべてゼロとして表示される可能性があるため、デシメーションは最適ではありません。

デシメーションは、各 LCD 水平ピクセルがデシメーション ポイント間のデータの最小値と最大値でプロットされるようにスマートにする必要があります。次に、ズームインすると、さらに詳細が表示されます。

ズームを使用すると、これは matplotlib の外では簡単に実行できないため、内部で処理する方が適切です。

于 2015-02-02T19:26:33.453 に答える