2016-04-05 10 views
6

Per il seguente codiceTypeError: Invalid dimensioni per dati dell'immagine durante la stampa con matrice imshow()

# Numerical operation 
SN_map_final = (new_SN_map - mean_SN)/sigma_SN 

# Plot figure 
fig12 = plt.figure(12) 
fig_SN_final = plt.imshow(SN_map_final, interpolation='nearest') 
plt.colorbar() 

fig12 = plt.savefig(outname12) 

con new_SN_map essendo una matrice 1D e mean_SN e sigma_SN essendo costanti, ottengo il seguente errore.

Traceback (most recent call last): 
    File "c:\Users\Valentin\Desktop\Stage M2\density_map_simple.py", line 546, in <module> 
    fig_SN_final = plt.imshow(SN_map_final, interpolation='nearest') 
    File "c:\users\valentin\appdata\local\enthought\canopy\user\lib\site-packages\matplotlib\pyplot.py", line 3022, in imshow 
    **kwargs) 
    File "c:\users\valentin\appdata\local\enthought\canopy\user\lib\site-packages\matplotlib\__init__.py", line 1812, in inner 
    return func(ax, *args, **kwargs) 
    File "c:\users\valentin\appdata\local\enthought\canopy\user\lib\site-packages\matplotlib\axes\_axes.py", line 4947, in imshow 
    im.set_data(X) 
    File "c:\users\valentin\appdata\local\enthought\canopy\user\lib\site-packages\matplotlib\image.py", line 453, in set_data 
    raise TypeError("Invalid dimensions for image data") 
TypeError: Invalid dimensions for image data 

Qual è la fonte di questo errore? Pensavo che le mie operazioni numeriche fossero consentite.

+1

Leggere il messaggio di errore e fornire le informazioni mancanti. L'errore è piuttosto semplice. –

+0

È possibile stampare la variabile SN_map_final? –

+0

Inoltre, correggi il tuo titolo. Non ha nulla a che fare con la domanda. –

risposta

10

c'è una (un po ') relative domande sul StackOverflow:

Il motivo per l'eccezione

TypeError: Invalid dimensions for image data

è lo stesso qui: matplotlib.pyplot.imshow() ha bisogno di una matrice 2D , o una matrice 3D con la terza dimensione di forma 3 o 4!

Puoi controllare facilmente questo con (questi controlli sono fatte da imshow, tale funzione ha il solo scopo di dare un messaggio più preciso nel caso in cui non è un input valido):

from __future__ import print_function 
import numpy as np 

def valid_imshow_data(data): 
    data = np.asarray(data) 
    if data.ndim == 2: 
     return True 
    elif data.ndim == 3: 
     if 3 <= data.shape[2] <= 4: 
      return True 
     else: 
      print('The "data" has 3 dimensions but the last dimension ' 
        'must have a length of 3 (RGB) or 4 (RGBA), not "{}".' 
        ''.format(data.shape[2])) 
      return False 
    else: 
     print('To visualize an image the data must be 2 dimensional or ' 
       '3 dimensional, not "{}".' 
       ''.format(data.ndim)) 
     return False 

Nel tuo caso:

>>> new_SN_map = np.array([1,2,3]) 
>>> valid_imshow_data(new_SN_map) 
To visualize an image the data must be 2 dimensional or 3 dimensional, not "1". 
False 

Il np.asarray è ciò che è fatto internamente da matplotlib.pyplot.imshow quindi è generalmente meglio lo fate troppo. Se hai una matrice numpy è obsoleta, ma in caso contrario (ad esempio uno list) è necessario.


Nel tuo caso specifico che ha una serie 1D, quindi è necessario aggiungere una dimensione con np.expand_dims()

import matplotlib.pyplot as plt 
a = np.array([1,2,3,4,5]) 
a = np.expand_dims(a, axis=0) # or axis=1 
plt.imshow(a) 
plt.show() 

enter image description here

o semplicemente usare qualcosa che accetta gli array 1D come plot:

a = np.array([1,2,3,4,5]) 
plt.plot(a) 
plt.show() 

enter image description here