1. ホーム
  2. python

[解決済み】TypeError: imshow()で配列をプロットすると、画像データの寸法が不正になる

2022-02-16 12:42:24

質問

以下のコードについて

# 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 は1次元配列であり 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

このエラーの原因は何でしょうか?数値演算は許可されていると思ったのですが。

どのように解決するのですか?

StackOverflowに(多少)関連する質問があります。

ここで問題となったのは、形状が (nx,ny,1) の配列は、やはり3次元配列とみなされ、以下のようにしなければならないことです。 squeeze dまたは2D配列にスライスしてください。

より一般的には、Exceptionが発生する理由

TypeError: 画像データの寸法が無効です

はここに表示されます。 matplotlib.pyplot.imshow() 2次元配列、または3次元が3か4の形状を持つ3次元配列が必要です!

で簡単に確認することができます(これらの確認は 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.asarray が内部で行っていることです。 matplotlib.pyplot.imshow ということで、一般的にはそうするのがベストです。もしnumpyの配列があれば、それは時代遅れですが、そうでなければ(たとえば list が必要です。


あなたの場合、1次元の配列なので 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()

のような1次元配列を受け付けるものを使うか、あるいは plot :

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