Ответ 1
В StackOverflow есть (несколько) вопрос:
Здесь проблема заключалась в том, что массив формы (nx, ny, 1) по-прежнему считается трехмерным массивом и должен быть squeeze
d или отрезан в 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.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()