web-dev-qa-db-ja.com

Matplotlib.pyplot.hist()が非常に遅い

配列に約10,000個のアイテムをプロットしています。それらは約1,000の固有の値です。

プロットは現在30分実行されています。残りのコードが機能することを確認しました。

遅いですか?ヒストグラムをpyplotでプロットするのはこれが初めてです。

9
Fenwick

Matplotlibを使用してヒストグラムをすばやくプロットするには、histtype='step'引数をpyplot.histに渡す必要があります。例えば:

plt.hist(np.random.exponential(size=1000000,bins=10000))
plt.show()

パンまたはズームすると、描画に最大15秒、更新に約5〜10秒かかります。

対照的に、histtype='step'でプロット:

plt.hist(np.random.exponential(size=1000000),bins=10000,histtype='step')
plt.show()

ほぼ即座にプロットし、遅滞なくパンおよびズームできます。

8
user545424

seaborn をコードのどこかにインポートすると、 pyplot.hist に非常に長い時間がかかる場合があります。

問題が海に浮かぶ場合は、matplotlib設定をリセットすることで解決できます。

import seaborn as sns
sns.reset_orig()
5
np8

私にとって問題は、pd.seriesのデータ型(たとえばS)が「float64」ではなく「object」であるということです。 S = np.float64(S)を使用した後、plt.hist(S)は非常に高速です!!

1
Napoléon

Numpy配列をフラット化した後、すぐにヒストグラムをプロットします。以下のデモコードを試してください。

import numpy as np

array2d = np.random.random_sample((512,512))*100
plt.hist(array2d.flatten())
plt.hist(array2d.flatten(), bins=1000)
1
CcMango

パンダを使用している場合は、plt.hist()で渡したデータがデータフレームではなく1-dシリーズであることを確認してください。これは私を助けました。

0
Shengge Yang

私にとっては、histの呼び出し後にfigure.canvas.draw()を呼び出してすぐに更新する必要がありました。つまり、histは実際には高速でした(タイミングを計った後に発見されました)が、図が更新されるまでに数秒の遅延がありました。 jupyterラボセル(qt5バックエンド)のmatplotlibコールバック内でhistを呼び出していました。

0
Yuri Feldman

私が抱えていた問題に遭遇した人は誰でも-(これは完全に私の悪いことです:))

数値を扱う場合は、CSVから読み取るときに、データ型が文字列ではなくint/floatであることを確認してください。

values_arr = .... .flatten().astype('float')
0
Oded Ben Dov