2016-05-20 9 views
0

Ich muss eine große Menge verschiedener Objekte (~ 10^5 gefüllte Ellipsen und ähnliche Formen) zeichnen. Ich füge sie nacheinander mit dem Befehl plt.gcf(). Gca(). Add_artist (e) hinzu und benutze plt.show() am Ende. Dies erfordert mehr Speicher als das, was ich habe.Wie vermeidet man, dass beim Python-Plotting der Arbeitsspeicher knapp wird?

Gibt es eine Möglichkeit, sie einzeln aufzuzeichnen (d. H. Ohne sie wie oben hinzuzufügen) und damit die Menge an Speicher zu reduzieren, die ich konsumiere? Mir geht es auch mit einer Lösung, die den Zeitaufwand für das Plotten deutlich erhöht.

+0

Was passiert, wenn Sie die Figur am Ende speichern, anstatt sie mit mpl zu rendern? – pbreach

+0

['matplotlib.collections'] (http://matplotlib.org/api/collections_api.html#module-matplotlib.collections) Klassen für das *** effiziente *** Zeichnen von großen Sammlungen von Objekten, die die meisten Eigenschaften teilen [ ...] - Betonung gehört mir – gboffi

Antwort

1

Um eine große Menge gleichartiger Objekte zu zeichnen Sie haben eine der verschiedenen matplotlib.collections Klassen verwenden - ach, ihre Nutzung ein bisschen obskur ist, zumindest wenn es mein Verständnis ist, dass ...

beteiligt ist

Wie dem auch sei von den docs und this official example Start konnte ich den folgenden Code, um gemeinsam

$ cat ellipses.py 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.collections import EllipseCollection 

N = 10**5 

# centres of ellipses — uniform distribution, -5<=x<5, -3<=y<3 
xy = np.random.random((N,2))*np.array((5*2,3*2))-np.array((5,3)) 

# width, height of ellipses 
w, h = np.random.random(N)/10, np.random.random(N)/10 

# rotation angles, anticlockwise 
a = np.random.random(N)*180-90 

# we need an axes object for the correct scaling of the ellipses 
fig, ax = plt.subplots() 

# create the collection 
ec = EllipseCollection(w, h, a, 
        units='x', 
        offsets=xy, 
        transOffset=ax.transData) 

ax.add_collection(ec) 
ax.autoscale(tight=True) 

plt.savefig('el10^5.png') 

ich es auf meine fast Low-End-Notebook

$ time python -c 'import numpy; import matplotlib.pyplot as p; f, a = p.subplots()' 

real 0m0.697s 
user 0m0.620s 
sys  0m0.072s 
$ time python ellipses.py 

real 0m5.704s 
user 0m5.616s 
sys  0m0.080s 
$ 
timed

Wie Sie sehen können, wenn Sie die erforderliche Staging für jede Handlung abschreiben, dauert es etwa 5 Sekunden - und was ist das Ergebnis?

el10^5.png

Ich denke, dass die Details über Exzentrizität und Winkel sind in einer solchen dichten Darstellung verloren, aber ich weiß nicht, die Besonderheiten Ihrer Aufgabe und wird nicht weiter kommentieren.

Verwandte Themen