TypeError:使用 imshow() 绘制数组时图像数据的尺寸无效

Posted

技术标签:

【中文标题】TypeError:使用 imshow() 绘制数组时图像数据的尺寸无效【英文标题】:TypeError: Invalid dimensions for image data when plotting array with imshow() 【发布时间】:2016-07-25 16:43:57 【问题描述】:

如下代码

# 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

这个错误的根源是什么?我以为我的数值运算是允许的。

【问题讨论】:

阅读错误信息并提供缺失的信息。错误很简单。 你能打印变量 SN_map_final 吗? 另外,修正你的标题。它与问题无关。 @Reti43 所以减号是必要的? 我没有投反对票。我只改进了帖子的呈现方式。我认为就目前而言,这是一个很好的问题,但反对者可能早已不复存在。 【参考方案1】:

*** 上有一个(有点)相关的问题:

Showing an image with pylab.imshow()

这里的问题是形状为 (nx,ny,1) 的数组仍被视为 3D 数组,并且必须是 squeezed 或切片为 2D 数组。

更一般地说,异常的原因

TypeError:图像数据的尺寸无效

在这里显示:matplotlib.pyplot.imshow() 需要一个 2D 数组,或者一个 3D 数组,其第三维的形状为 3 或 4!

您可以通过以下方式轻松检查(这些检查由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),它是必要的。


在您的特定情况下,您有一个一维数组,因此您需要使用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这样接受一维数组的东西:

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

【讨论】:

以上是关于TypeError:使用 imshow() 绘制数组时图像数据的尺寸无效的主要内容,如果未能解决你的问题,请参考以下文章

使用numpy蒙版数组和imshow绘制分段彩色图像

Matplotlib:使用 imshow 显示数组值

matplotlib imshow

子图中的 Python xticks

Imshow:范围和方面

从 imshow 获取插值数据