次のコードの場合
# 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
が1D配列であり、mean_SN
およびsigma_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)がまだ3D配列と見なされ、squeeze
dであるか、2D配列にスライスされる必要があることでした。
より一般的には、例外の理由
TypeError:画像データの無効な寸法
matplotlib.pyplot.imshow()
には、2D配列、または形状3または4の3次元の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.asarray
はmatplotlib.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()