2010-10-07 17 views
16

Ho una matrice numpy in Python e mi piacerebbe visualizzarla sullo schermo come immagine raster. Qual è il modo più semplice per farlo? Non ha bisogno di essere particolarmente elaborato o di avere un'interfaccia piacevole, tutto quello che devo fare è visualizzare il contenuto dell'array come un'immagine raster in scala di grigi.Mostra array come immagine raster in python

Sto provando a passare parte del mio codice IDL a Python con NumPy e sto fondamentalmente cercando un sostituto per i comandi tv e tvscl in IDL.

risposta

25

A seconda delle esigenze, o matplotlib's imshow o glumpy sono probabilmente le migliori opzioni.

Matplotlib è infinitamente più flessibile, ma più lento (le animazioni in matplotlib possono essere sorprendentemente dispendiose in termini di risorse anche quando si fa tutto correttamente.). Tuttavia, avrai a tua disposizione una meravigliosa e completa libreria di tracciamento.

Glumpy è perfettamente adatto per la visualizzazione e animazione rapida basata su openGL di un array di numpy 2D, ma è molto più limitato in ciò che fa. Se è necessario animare una serie di immagini o visualizzare i dati in tempo reale, è comunque un'opzione di gran lunga migliore di matplotlib.

Utilizzando matplotlib (utilizzando l'API pyplot invece di pylab):

import matplotlib.pyplot as plt 
import numpy as np 

# Generate some data... 
x, y = np.meshgrid(np.linspace(-2,2,200), np.linspace(-2,2,200)) 
x, y = x - x.mean(), y - y.mean() 
z = x * np.exp(-x**2 - y**2) 

# Plot the grid 
plt.imshow(z) 
plt.gray() 
plt.show() 

Utilizzando glumpy:

import glumpy 
import numpy as np 

# Generate some data... 
x, y = np.meshgrid(np.linspace(-2,2,200), np.linspace(-2,2,200)) 
x, y = x - x.mean(), y - y.mean() 
z = x * np.exp(-x**2 - y**2) 

window = glumpy.Window(512, 512) 
im = glumpy.Image(z.astype(np.float32), cmap=glumpy.colormap.Grey) 

@window.event 
def on_draw(): 
    im.blit(0, 0, window.width, window.height) 
window.mainloop() 
+0

Grazie ancora @Joe, [questa risposta mi ha fatto risolvere la mia stessa domanda!] (Http://stackoverflow.com/questions/5003094/how-can-i-speed-up-an-animation/5471487#5471487) –

4

Utilizzando ipython in modalità interattiva pylab, si potrebbe fare:

$ ipython pylab 
In [1]: imshow(your_array) 

o meno in modalità pylab:

$ ipython 
In [1]: from pylab import * 
In [2]: imshow(your_array) 
In [3]: pylab.show() 

o senza la cosa pylab namespace:

$ ipython 
In [1]: import matplotlib.pyplot as pyplot 
In [2]: pyplot.imshow(your_array) 
In [3]: pyplot.show() 
2

aggiunta rapida: per la visualizzazione con matplotlib, se si desidera che l'immagine appaia "raster ", ovvero, pixelizzato senza attenuazione, dovresti includere l'opzione interpolation =" più vicina "nella chiamata a imshow.