TypeError: Invalid dimensions for image data when plotting array with imshow()

匿名 (未验证) 提交于 2019-12-03 03:06:01

问题:

For the following code

# 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) 

with new_SN_map being a 1D array and mean_SN and sigma_SN being constants, I get the following error.

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 

What is the source of this error? I thought my numerical operations were allowed.

回答1:

There is a (somewhat) related questions on StackOverflow:

The reason for the Exception

TypeError: Invalid dimensions for image data

is the same here: matplotlib.pyplot.imshow() needs a 2D array, or a 3D array with the third dimension being of shape 3 or 4!

You can easily check this with (these checks are done by imshow, this function is only meant to give a more specific message in case it's not a valid input):

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 

In your case:

>>> 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 

The np.asarray is what is done internally by matplotlib.pyplot.imshow so it's generally best you do it too. If you have a numpy array it's obsolete but if not (for example a list) it's necessary.


In your specific case you got a 1D array, so you need to add a dimension with 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() 

or just use something that accepts 1D arrays like plot:

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



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!