类型错误:使用imshow()绘制数组时,图像数据的尺寸无效。

54

对于以下代码

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

使用 new_SN_map 作为一维数组,而 mean_SNsigma_SN 作为常数时,我收到了以下错误信息。

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

这个错误的源头是什么?我以为我的数值操作是被允许的。


1
阅读错误信息并提供缺失的信息。该错误非常直观。 - Mad Physicist
@MSeifert 我得到的是:(63865L,),也就是说这是一个一维数组? - Essex
@Mad Physicist 嗯,我的问题是关于对数组进行数值操作的,对吧?如果我没有看到标题不好的地方,抱歉:/ - Essex
1
@Reti43 那么负投票是必要的吗? - Essex
3
我没有进行负面评价。我只是改善了这篇文章的呈现方式。我认为现在它作为一个问题已经很好了,但是那个进行负面评价的人可能已经离开了。 - Reti43
显示剩余3条评论
1个回答

75

在StackOverflow上有一个(稍微)相关的问题:

这里的问题是一个形状为(nx,ny,1)的数组仍然被视为3D数组,必须进行squeeze或切片以形成2D数组。

更普遍地,导致异常

TypeError: Invalid dimensions for image data

的原因在此处说明:matplotlib.pyplot.imshow()需要一个2D数组或第三维形状为3或4的3D数组!

你可以通过以下方式轻松检查这一点(这些检查由imshow执行,该函数仅旨在在输入无效时提供更具体的消息):

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

根据你的情况:

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

np.asarraymatplotlib.pyplot.imshow在内部执行的操作,因此最好也这样做。如果您有一个numpy数组,则它已过时,但如果没有(例如一个list),则需要使用它。


在您的特定情况下,您得到了一个1D数组,因此需要使用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()

输入图像描述

或者只需使用像plot这样接受1D数组的内容:

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

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接