1

私はPythonとプログラミングが初めてです。Pythonを使用して方向マップをプロットしようとしています。平面上に多数のポイント (約 1,200,000) があり、それぞれがクラスターに属しています。各クラスターは異なる色であると想定されています。私が現在行っているのは、各クラスターに色を割り当て、各ポイントに塗りつぶされた円を描くことです。さまざまなセグメントのプロットを作成し、ブレンドを使用してそれらを結合することで、部分的に実行しようとしました. これはパーツのコードです: (sn は点の総数、label はクラスター番号のクラスター配列、xcoor と ycoor は点の座標です)

pylab.xlim([0,250])
pylab.ylim([0,100])
plt.savefig("HK pickle.png")
for l in range (1, 20):
    for j in range(int((float(sn)/80)*(l-1)), int((float(sn)/80)*(l))):
        overlay = Image.open("HK pickle.png")
        c = label[j] % 8
        if c == 0:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0.5, 0, 0))
        elif c == 1:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (1, 0, 0))
        elif c == 2:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0, 0.5, 0))
        elif c == 3:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0, 1, 0))
        elif c == 4:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0, 0, 0.5))
        elif c == 5:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0, 0 ,1))
        elif c == 6:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0.5, 0.5 ,0))
        elif c == 7:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0.5, 0 ,0.5))
        fig = plt.gcf()
        fig.gca().add_artist(circle1)
        del circle1
    plt.savefig("HK pick.png")
    del fig
    back = Image.open("HK pick.png")
    comp = Image.blend(back, overlay, 0.5)
    comp.save("HK pickle.png", "PNG")
    del comp
pylab.xlim([0,250])
pylab.ylim([0,100])
plt.savefig("HK plots.png")

ただし、これにより次のエラーが発生します。

    fig.gca().add_artist(circle1)
  File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 1404, in add_artist
    self.artists.append(a)
MemoryError

エラーは l = 11 で発生します。タスク マネージャーを並行してチェックし続けましたが、MemoryError が表示されたとき、まだ 3GB 近くの空きメモリがありました。これで私を助けてください。

私はこれに不慣れで、私が提供した情報が十分かどうかまだわかりません。さらに情報が必要な場合はお知らせください

4

2 に答える 2

1

すべてのベクター グラフィックスをラスター イメージにフラット化する (メモリ消費量が少ない)scatterキーワードを使用すると、より適切な結果が得られる可能性があります。rasterized=True

何かのようなもの:

colors_lst = [ ... your tuples ...]
color = map(lambda x: colors_lst[x % 8], labels)
ax.scatter(xcoord, ycoord, c = colors, rasterized=True)

あなたのスクリプトのほとんどを置き換えると思います。

scatterドキュメンテーション

于 2013-01-29T15:22:12.330 に答える
0

32 ビット OS または 32 ビット Python を実行している場合、大規模なデータ セットを効率的に処理することはできません (64 ビット Python、numpy、matplotlib などをインストールすると、これが修正される場合があります)。

ただし、最初に低解像度で絵を描いてみて、それがうまくいくかどうかを確認することをお勧めします (結果は十分である可能性があります)。たとえば、最初にjイテレータfor j in range(int((float(sn)/80)*(l-1)), int((float(sn)/80)*(l))):を次のようなものに置き換えます

for j in np.linspace(int((float(sn)/80)*(l-1)), int((float(sn)/80)*(l), num=20):
    j = int(j)

これにより、制限内で20個のj値の範囲が得られますが、各整数値では得られません。である可能性が高いため、!にキャストjする必要があることに注意してください。intnp.float

他のスタイルのコメントは、この時点ではあまり役に立ちませんが、一般に、頻繁に行う必要はありませんdel。Python には、これを行う非常に優れたガベージ コレクターがあります。イテレータの外に制限を設定することもできます - これにより、デバッグがより簡単になります:

start_j = int((float(sn)/80)*(l-1)))
end_j = int((float(sn)/80)*(l))
for j in np.linspace(start_j, end_j, num=20):
    etc.
于 2013-01-29T12:17:02.307 に答える