TypeError: недопустимые размеры для данных изображения при построении массива с помощью imshow()
для следующего кода
# 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:UsersValentinDesktopStage M2density_map_simple.py", line 546, in <module>
fig_SN_final = plt.imshow(SN_map_final, interpolation='nearest')
File "c:usersvalentinappdatalocalenthoughtcanopyuserlibsite-packagesmatplotlibpyplot.py", line 3022, in imshow
**kwargs)
File "c:usersvalentinappdatalocalenthoughtcanopyuserlibsite-packagesmatplotlib__init__.py", line 1812, in inner
return func(ax, *args, **kwargs)
File "c:usersvalentinappdatalocalenthoughtcanopyuserlibsite-packagesmatplotlibaxes_axes.py", line 4947, in imshow
im.set_data(X)
File "c:usersvalentinappdatalocalenthoughtcanopyuserlibsite-packagesmatplotlibimage.py", line 453, in set_data
raise TypeError("Invalid dimensions for image data")
TypeError: Invalid dimensions for image data
что является источником этой ошибки? Я думал, что мои числовые операции разрешены.
1 ответов
есть (несколько) связанные вопросы по StackOverflow:
причина исключения
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.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()
или просто используйте что-то, что принимает массивы 1D, такие как plot
:
a = np.array([1,2,3,4,5])
plt.plot(a)
plt.show()